Self Crossing

hard math geometry

Problem

A path moves in counter-clockwise directions (N, W, S, E, N…) for d[i] units each. Return true if it crosses itself.

Inputdistance = [2,1,1,2]
Outputtrue
The 4th leg touches the 1st — crossing.

def is_self_crossing(d):
    n = len(d)
    for i in range(3, n):
        if d[i] >= d[i-2] and d[i-1] <= d[i-3]:
            return True
        if i >= 4 and d[i-1] == d[i-3] and d[i] + d[i-4] >= d[i-2]:
            return True
        if i >= 5 and d[i-2] >= d[i-4] and d[i-3] >= d[i-1] and            d[i-1] + d[i-5] >= d[i-3] and d[i] + d[i-4] >= d[i-2]:
            return True
    return False
function isSelfCrossing(d) {
  for (let i = 3; i < d.length; i++) {
    if (d[i] >= d[i-2] && d[i-1] <= d[i-3]) return true;
    if (i >= 4 && d[i-1] === d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
    if (i >= 5 && d[i-2] >= d[i-4] && d[i-3] >= d[i-1] &&
        d[i-1] + d[i-5] >= d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
  }
  return false;
}
class Solution {
    public boolean isSelfCrossing(int[] d) {
        for (int i = 3; i < d.length; i++) {
            if (d[i] >= d[i-2] && d[i-1] <= d[i-3]) return true;
            if (i >= 4 && d[i-1] == d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
            if (i >= 5 && d[i-2] >= d[i-4] && d[i-3] >= d[i-1] &&
                d[i-1] + d[i-5] >= d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
        }
        return false;
    }
}
bool isSelfCrossing(vector& d) {
    for (int i = 3; i < (int)d.size(); i++) {
        if (d[i] >= d[i-2] && d[i-1] <= d[i-3]) return true;
        if (i >= 4 && d[i-1] == d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
        if (i >= 5 && d[i-2] >= d[i-4] && d[i-3] >= d[i-1] &&
            d[i-1] + d[i-5] >= d[i-3] && d[i] + d[i-4] >= d[i-2]) return true;
    }
    return false;
}
Time: O(n) Space: O(1)