335. Self Crossing

问题描述:

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)

解题思路:

这道题我一开始想简单了,但是后来想到了更多的情况后就自己驳回自己了

所以我参考了Grandyang的总结

枚举出可能的情况:

     x(1)
    ┌───┐
x(2)│   │x(0)
    └───┼──>
    x(3)│
        
      x(1)
    ┌──────┐
    │      │x(0)
x(2)│      ^
    │      │x(4)
    └──────│
      x(3)


      x(1)
    ┌──────┐
    │      │x(0)
x(2)│     <│────│
    │       x(5)│x(4)
    └───────────│
        x(3)

根据这三种情况列出可能会出现selfcross的条件

代码:

class Solution {
public:
    bool isSelfCrossing(vector<int>& x) {
        for(int i = 3; i < x.size(); i++){
            if(x[i] >= x[i-2] && x[i-3] >= x[i-1]){
                return true;    
            }
            if(i >= 4 && x[i-1] == x[i-3] && x[i-2] <= (x[i]+x[i-4])){
                return true;
            }
            if(i >= 5 && x[i-2] >= x[i-4] && x[i-3] >= x[i-1] && x[i-1] + x[i-5] >= x[i-3] && x[i] + x[i-4] >= x[i-2])
                return true;
        }
        return false;
    }
};
原文地址:https://www.cnblogs.com/yaoyudadudu/p/9232012.html