Problem
You are given an array of integers distance
.
You start at point (0,0)
on an X-Y plane and you move distance[0]
meters to the north, then distance[1]
meters to the west, distance[2]
meters to the south, distance[3]
meters to the east, and so on. In other words, after each move, your direction changes counter-clockwise.
Return true
if your path crosses itself, and false
if it does not.
Example 1:
Input: distance = [2,1,1,2]
Output: true
Example 2:
Input: distance = [1,2,3,4]
Output: false
Example 3:
Input: distance = [1,1,1,1]
Output: true
Constraints:
1 <= distance.length <= 10^5
1 <= distance[i] <= 10^5
Solution
/**
* @param {number[]} distance
* @return {boolean}
*/
var isSelfCrossing = function(distance) {
for ( var i = 3; i < distance.length; i++ ){
// i. [2, 1, 1, 2]
if (distance[i - 3] && distance[i] >= distance[i - 2] && distance[i - 1] <= distance[i - 3 ])
return true ;
// ii. [1, 1, 2, 1, 1]
if (distance[i - 4] && distance[i - 3] === distance[i - 1] && distance[ i - 4] + distance[i] >= distance[i - 2 ])
return true ;
// iii. [1, 1, 2, 2, 1, 1]
if (distance[i - 5] && distance[i - 4] <= distance[i -2] && distance[i] + distance[i - 4] >= distance[i -2 ]
&& distance[i - 3] >= distance[i - 1] && distance[i - 5] + distance[i - 1] >= distance[i - 3 ])
return true ;
}
return false ;
};
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).