【LeetCode】Self Crossing(335)

简介:  You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west, x[2] metres to the south, x[3] metres to the east and so on. In other words, after each move your direction changes counter-clockwise.  Write a one-pass algor

1. Description


  You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west, x[2] metres to the south, x[3] metres to the east and so on. In other words, after each move your direction changes counter-clockwise.


  Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.


  Example 1:


Given x =

[2, 1, 1, 2]

,

┌───┐

│   │

└───┼──>

   │


Return true (self crossing)


  Example 2:

Given x =

[1, 2, 3, 4]

,

┌──────┐

│      │

└────────────>


Return false (not self crossing)


  Example 3:

Given x =

[1, 1, 1, 1]

,

┌───┐

│   │

└───┼>


Return true (self crossing)



2. Answer


public class Solution {
    public boolean isSelfCrossing(int[] x) {
        // Check for initial four values manually.
        if (x.length < 4) {
            for (int el : x) {
                if (el == 0)
                    return true;
            }
            return false;
        }
        for (int i = 3; i < x.length; i++) {
            int cur = x[i];
            if (cur == 0)
                return true;
            // At any point of time, i-1 has to be less than i-3 in order to
            // intersect. Draw few figures to realize this.
            if (x[i - 1] <= x[i - 3]) {
                // Basic case. Straight forward intersection.
                //            ___
                //           |___|__  
                //               |
                //
                if (cur >= x[i - 2]) {
                    return true;
                }
                // Special case.
                if (i >= 5) {
                    // if i-2 edge is less than i-4 th edge then it cannot
                    // intersect no matter what if i < i-2 th edge.
                    //            ____
                    //           | _  | 
                    //           |__| |
                    //                |
                    if (x[i - 2] < x[i - 4])
                        continue;
                    // the intersecting case.
                    //                ____
                    //             ___|   |
                    //            |   |   |
                    //            |   |   | 
                    //            |_______|
                    //
                    if ((x[i] + x[i - 4] >= x[i - 2])
                            && (x[i - 1] + x[i - 5] >= x[i - 3]))
                        return true;
                }
            }
            // equals case
            //                 ___
            //                |   |
            //                |___|
            //
            if (i >= 4)
                if (x[i - 1] == x[i - 3] && cur + x[i - 4] == x[i - 2])
                    return true;
        }
        return false;
    }
}
目录
相关文章
|
存储 Python
LeetCode 315. Count of Smaller Numbers After Self
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
89 0
LeetCode 315. Count of Smaller Numbers After Self
LeetCode 238. Product of Array Except Self
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
77 0
LeetCode 238. Product of Array Except Self
Leetcode-Easy 728. Self Dividing Numbers
Leetcode-Easy 728. Self Dividing Numbers
84 0
Leetcode-Easy 728. Self Dividing Numbers
|
索引
LeetCode 238 Product of Array Except Self(除自身外数组其余数的乘积)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50810589 翻译 给定一个有n个数字的数组nums,其中n大于1,返回一个数组使得output[i]等于除nums[i]外所有元素的乘积。
919 0
[LeetCode] Product of Array Except Self
The first answer in this link has a nice illustrative explanation. Suppose the given array is like [nums[0], nums[1], nums[2], nums[3]].
667 0
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6