LeetCode——335. 路径交叉(Self Crossing)[困难]——分析及代码(C++)

LeetCode——335. 路径交叉[Self Crossing][困难]——分析及代码[C++]

一、题目

给你一个整数数组 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 类,分别进行处理,详细分析可见 官方题解

(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% 的用户。

三、其他

也可对路径不交叉的情况进行归纳,然后分类处理。

Guess you like

Origin blog.csdn.net/zml66666/article/details/121044993
Recommended