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; } };