zoukankan      html  css  js  c++  java
  • LeetCode 335. Self Crossing

    挺有趣的一道题,看题解才勉强做出。。。

    题意就是给n个长度,然后以上左下右的顺序走。比如 [2,1,1,2]就是先上走2 左走1 下走1 右走2 如果还有就继续向上,向左……

    求路径中是否存在交叉。

    如果在纸上画一画,就会发现,在保证不出现交叉的前提下,可画的类型无非几种

    (实不相瞒,我用微信截图随便画的)

    就是说如果出现交叉,并不需要考虑和相离较远的某条线段的交叉,因为肯定会和附近的某条线进行交叉。所以算法是 O(N) 而不是 O(N^2)

    总结一下可能出现的交叉 不画了 copy from https://blog.csdn.net/zmq570235977/article/details/51705518

    图中考虑的三种情况,实际要考虑多个方向。不过判断条件是一样的。

    class Solution {
    public:
        bool isSelfCrossing(vector<int>& x) {
            int n = x.size();
            // 小于4条边是不会出现交叉的
            for (int i = 3; i < n; i++) {
                if (
                    x[i - 1] <= x[i - 3] && x[i] >= x[i - 2]
                    || (i >= 4 && i <= 8
                        && x[i - 4] + x[i] >= x[i - 2] 
                        && x[i - 3] == x[i - 1])
                    || (i >= 5 && i <= 8
                        && x[i - 1] <= x[i - 3] 
                        && x[i - 5] + x[i - 1] >= x[i - 3] 
                        && x[i - 4] <= x[i - 2] 
                        && x[i - 4] + x[i] >= x[i - 2])
                ) return true;
            }
            return false;
        }
    };
  • 相关阅读:
    Java回调机制
    显示Title和隐藏Title的ListView
    ListView的小知识
    小知识点
    Shader的使用
    项目知识(二)
    项目知识(一)
    复习篇(一)Activity的生命周期和启动模式
    BootStrap 提示框
    BootStrap选项卡
  • 原文地址:https://www.cnblogs.com/wenruo/p/12181570.html
Copyright © 2011-2022 走看看