AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 335. Self Crossing    原题链接    困难

作者: 作者的头像   yxc ,  2018-06-28 20:41:36 ,  所有人可见 ,  阅读 1534


2


题目描述

给定一个数组,包含 $n$ 个正整数。你从起点(0,0)开始,x[0]表示往北走的距离,x[1]表示往西走的距离,x[2]表示往南走的距离,[x3]表示往东走的距离,依次类推。换句话说,你一直在按顺时针方向转圈。

请编写一个函数,判断走过的路径是否相交。
只能使用额外 $O(1)$ 的空间。

样例1

给定 x = [2, 1, 1, 2],
?????
?   ?
???????>
    ?

返回 true (路径相交)

样例2

给定 x = [1, 2, 3, 4],
????????
?      ?
?
?
?????????????>

返回 false (路径不相交)

样例3

给定 x = [1, 1, 1, 1],
?????
?   ?
?????>

返回 true (路径相交)

算法

(分情况讨论) $O(n)$

我们分类讨论相交的情况有哪些。一共有三种:

  1. 连续的四条边相交:
    QQ图片20180628203655.png
  2. 连续的五条边相交:
    QQ图片20180628203840.png
  3. 连续的六条边相交:
    QQ图片20180628203957.png

然后遍历整个数组,判断这三种情况即可。

时间复杂度分析:整个数组仅被遍历一次,所以时间复杂度是 $O(n)$。

C++ 代码

class Solution {
public:
    bool isSelfCrossing(vector<int>& x) {
        int n = x.size();
        if (n <= 3) return false;
        for (int i = 3; i < n; i ++ )
        {
            if (x[i] >= x[i - 2] && x[i - 1] <= x[i - 3]) return true;
            if (i >= 4 && x[i - 1] == x[i - 3] && x[i] + x[i - 4] >= x[i - 2]) return true;
            if (i >= 5 && x[i - 2] >= x[i - 4] && x[i] + x[i - 4] >= x[i - 2] && x[i - 1] + x[i - 5] >= x[i - 3]  && x[i - 1] <= x[i - 3]) return true;
        }
        return false;
    }
};

1 评论


用户头像
天才小笼包   2021-09-07 10:28      1    踩      回复

当个人觉得滑动窗口思路比较好接受.

线段条数小于 4 时,不可能发生交叉。
线段条数大于等于 4 时,开始出现交叉的可能性:
第 4 条线段只可能与第 1 条线段交叉。
第 5 条线段只可能与第 2、1 条线段交叉。
第 6 条线段只可能与第 3、(2)、1 条线段交叉。
第 7 条线段只可能与第 4、(3)、2 条线段交叉(注意,不可能与第 1 条线段交叉,因为路径是逆时针的,此时线段 1 要么被围在内部,要么被抛在外部)
……
从上面分析可以看出,我们至多需要一个大小为 6 的滑动窗口,即可覆盖所有的交叉情况。滑动窗口每移动一步,我们都判断一次新进入窗口的线段与最前面三条线段的交叉关系。
https://leetcode-cn.com/problems/self-crossing/solution/lu-jing-jiao-cha-hua-dong-chuang-kou-jie-fa-by-hzh/


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息