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)
判断是否交叉,经过分析,可知:
假设x数组构成的图形中,i-1前面的点均无十字交叉,对于第i个点,只需要判断:
i-3~i四个节点构成的图形是否有交叉;
i-4~i五个节点构成的图形是否有交叉;
i-5~i六个节点构成的图形是否有交叉;
如果上述三种情况均没有交叉,说明第x个节点(含x)前的点构成的图形没有交叉点,重复上述过程。程序如下所示:
class Solution {
public boolean isSelfCrossing(int[] x) {
for (int i = 3; i < x.length; ++ i){
if (i >= 3&&x[i-1] <= x[i-3] && x[i] >= x[i-2]){
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-1] <= x[i-3]&&x[i-2] >= x[i-4]&&x[i] + x[i-4] >= x[i-2]&&x[i-1] + x[i-5] >= x[i-3]){
return true;
}
}
return false;
}
}