Self Crossing
2016-06-03 05:11 摘花 阅读(688) 评论(0) 编辑 收藏 举报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)
思路:如果相交,必定是经过同一点,记录所有点,比较即可。
int a = 0,b = 0,len = x.length; HashSet<String> recodePoint = new HashSet<String>(); recodePoint.add(a + "-" + b);//start point if(len == 0) return false; for (int i = 0; i < len; i++) { if(i % 4 == 0){ for(int j = 0;j < x[i]; j++){ String point = a+"-"+ ++b; if(recodePoint.contains(point)) return true; else recodePoint.add(point); } } if(i % 4 == 1) for(int j = 0;j < x[i]; j++){ String point = --a+"-"+b; if(recodePoint.contains(point)) return true; else recodePoint.add(point); } if(i % 4 == 2) for(int j = 0;j < x[i]; j++){ String point = a+"-"+ --b; if(recodePoint.contains(point)) return true; else recodePoint.add(point); } if(i % 4 == 3) for(int j = 0;j < x[i]; j++){ String point = ++a+"-"+ b; if(recodePoint.contains(point)) return true; else recodePoint.add(point); } } return false;