335.路径交叉
给定一个整数数组 distance :
1 <= distance.length <= 10^5,
1 <= distance[i] <= 10^5。
从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。
判断你所经过的路径是否相交。如果相交,返回 true ;否则,返回 false 。
示例1:
输入:distance = [2,1,1,2]
输出:true
示例2:
输入:distance = [1,2,3,4]
输出:false
示例3:
输入:distance = [1,1,1,1]
输出:true
思路:使用归纳法对所有可能的路径交叉进行总结。
第一类:
· 第 i-1次移动距离小于等于第 i-3 次移动距离;
· 第 i 次移动距离大于等于第 i-2次移动距离。
第二类:
· 第 4 次移动距离等于第 2次移动距离;
· 第 3次移动距离大于第 1次移动距离,第 5 次移动距离大于等于第 3 次移动距离减第 1 次移动距离的差。
第三类:
· 第 i-3 次移动距离大于第 i-5 次移动距离,第 i-1次移动距离大于等于第 i-3 次移动距离减第 i-5 次移动距离的差,且小于等于第 i-3 次移动距离;
· 第 i-2 次移动距离大于第 i-4 次移动距离;注意此时第 i-2 次移动距离一定不等于第 i-4 次移动距离;
· 第 i 次移动距离大于等于第 i-2 次移动距离减第 i-4次移动距离的差。
代码:
class Solution {
public boolean isSelfCrossing(int[] distance){
int l = distance.length;
if (l >= 4) {
for (int i = 3; i < l; i++) {
if (distance[i] >= distance[i-2] && distance[i-3] >= distance[i-1])
return true;
if (i > 3 && distance[i-2] == distance[i] + distance[i-4] && distance[i-1] == distance[i-3])
return true;
if (i > 4 &&
distance[i] >= distance[i-2] - distance[i-4] &&
distance[i-1] >= distance[i-3] - distance[i-5] &&
distance[i-3] >= distance[i-1] &&
distance[i-2] >= distance[i-4] &&
distance[i-3] >= distance[i-5])
return true;
}
}
return false;
}
}
执行结果:
总结: LeetCode打卡第三天,看到题的时候,完全没有解题的思路,在一步步的解读题目,查阅资料后,才慢慢有了思路,题目看似很难,在有了思路总结之后还是比较简单的,但代码的编写能力仍然需要提高!