一、题目
给你一个整数数组 distance 。
从 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
提示:
- 1 <= distance.length <= 10^5
- 1 <= distance[i] <= 10^5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/self-crossing
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 分类讨论
(1)思路
将路径可能的交叉情况归纳为 3 类,分别进行处理,详细分析可见 官方题解。
扫描二维码关注公众号,回复:
13202817 查看本文章
(2)代码
class Solution {
public:
bool isSelfCrossing(vector<int>& distance) {
for (int i = 3; i < distance.size(); i++) {
//i<=2时一定不会交叉
//第1种交叉情况
if (distance[i] >= distance[i - 2] && distance[i - 1] <= distance[i - 3]) {
return true;
}
//第2种交叉情况,i>4时合并入第3种情况
if (i == 4 && distance[1] == distance[3] && distance[0] + distance[4] >= distance[2]) {
return true;
}
//第3种交叉情况
if (i >= 5 && distance[i - 4] < distance[i - 2] && distance[i - 2] <= distance[i - 4] + distance[i]
&& distance[i - 1] <= distance[i - 3] && distance[i - 3] <= distance[i - 1] + distance[i - 5]) {
return true;
}
}
return false;
}
};
(3)结果
执行用时 :20 ms,在所有 C++ 提交中击败了 65.75% 的用户;
内存消耗 :18.2 MB,在所有 C++ 提交中击败了 76.71% 的用户。
三、其他
也可对路径不交叉的情况进行归纳,然后分类处理。