二维空间中有很多点需要按照特定的顺序访问。从一个点到另一个点的路径总是被选为最短路径,并且路径段总是与网格线对齐。现在我们得到了为访问点而选择的路径,我们需要告诉生成给定路径所需的最小点数。
例子:
在上图中,我们可以看到必须至少有 3 个点才能到达路径上方,分别用 A、B 和 C 表示
我们可以通过在访问止损时观察运动模式来解决这个问题。如果我们想要从一个点到另一个点的最短路径,那么我们将在一个或最多两个方向上移动,即总是有可能沿着最多两个方向到达另一点,如果使用两个以上的方向,则该路径不会是最短的,例如,路径 LLURD 只能用 LLL 替换,因此为了找到路径中的最小停靠点数,我们将遍历路径的字符并维护到目前为止所采取的方向图。如果在任何索引处我们发现“L”和“R”,或者我们发现“U”和“D”,那么必须在当前索引处停止,因此我们将停止计数增加一,然后我们将清除下一段的地图。
解决方案的总时间复杂度为 O(N)
// C++ program to find minimum number of points
// in a given path
#include
using namespace std;
// method returns minimum number of points in given path
int numberOfPointInPath(string path)
{
int N = path.length();
// Map to store last occurrence of direction
map dirMap;
// variable to store count of points till now,
// initializing from 1 to count first point
int points = 1;
// looping over all characters of path string
for (int i = 0; i < N; i++) {
// storing current direction in curDir
// variable
char curDir = path[i];
// marking current direction as visited
dirMap[curDir] = 1;
// if at current index, we found both 'L'
// and 'R' or 'U' and 'D' then current
// index must be a point
if ((dirMap['L'] && dirMap['R']) ||
(dirMap['U'] && dirMap['D'])) {
// clearing the map for next segment
dirMap.clear();
// increasing point count
points++;
// revisitng current direction for next segment
dirMap[curDir] = 1;
}
}
// +1 to count the last point also
return (points + 1);
}
// Driver code to test above methods
int main()
{
string path = "LLUUULLDD";
cout << numberOfPointInPath(path) << endl;
return 0;
}
输出:
3
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。