题目 335. 路径交叉
思路
卷来卷去,要想不相交,一共只能有三种情况:
1.要么一条路走到底一直往外卷,即从第三步开始,每一步都大于前两步的长度,即distance[i]>distance[i-2],这样卷到地老天荒都不会相交;
2.要么换一种卷法,一直往里卷(即内卷hhh),即从第三步开始,每一步都小于前两步的长度,即distance[i]<distance[i-2];
3.卷到一半突然换一种卷法之外卷转内卷(注:内卷不能突然转外卷,这样一定会相交的)。假如转换点为j,那么对于任意i<j都满足外卷条件,对于i>j都满足内卷条件。c++代码如下:
class Solution {
public:
bool isSelfCrossing(vector<int>& distance) {
int n=distance.size();
if(n<=3) return false;
//判断第一种情况(外卷)
int i=2;
while(i<n&&distance[i]>distance[i-2]){
i++;
}
if(i==n) return false;//不相交
//判断第三种情况(外卷转内卷),此时i就是转换点
if ((i == 3 and distance[i] == distance[i - 2])
|| (i >= 4 and distance[i] >= distance[i - 2] - distance[i - 4]))
distance[i - 1] -= distance[i - 3];
i += 1;
//判断第二种情况
while(i<n&&distance[i]<distance[i-2]){
i+=1;
}
if(i==n) return false;
return true;//其他情况都是相交
}
};