package com.fishercoder.solutions;

/**
 * 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)

 */
public class _335 {

    /**reference: https://discuss.leetcode.com/topic/38014/java-oms-with-explanation/2*/
    public boolean isSelfCrossing(int[] x) {
        int l = x.length;
        if (l <= 3) {
            return false;
        }

        for (int i = 3; i < l; i++) {
            if (x[i] >= x[i - 2] && x[i - 1] <= x[i - 3]) {
                return true;  //Fourth line crosses first line and onward
            }
            if (i >= 4) {
                if (x[i - 1] == x[i - 3] && x[i] + x[i - 4] >= x[i - 2]) {
                    return true; // Fifth line meets first line and onward
                }
            }
            if (i >= 5) {
                if (x[i - 2] - x[i - 4] >= 0 && x[i] >= x[i - 2] - x[i - 4] && x[i - 1] >= x[i - 3] - x[i - 5] && x[i - 1] <= x[i - 3]) {
                    return true;  // Sixth line crosses first line and onward
                }
            }
        }
        return false;
    }
}

@@ -788,16 +788,56 @@
 5 %7B%0A
-%0A
+    public static class Solution1 %7B%0A    
     /**
+ 
 refe
@@ -911,19 +911,24 @@
 nation/2
+ 
 */%0A
+    
     publ
@@ -972,16 +972,20 @@
         
+ 
+   
 int l = 
@@ -998,24 +998,28 @@
 th;%0A        
+   
+ 
 if (l %3C= 3) 
@@ -1016,24 +1016,28 @@
  (l %3C= 3) %7B%0A
+    
             
@@ -1062,11 +1062,19 @@
     
-%7D%0A%0A
+    %7D%0A%0A    
     
@@ -1115,24 +1115,28 @@
             
+    
 if (x%5Bi%5D %3E= 
@@ -1163,32 +1163,36 @@
  %3C= x%5Bi - 3%5D) %7B%0A
+    
                 
@@ -1253,32 +1253,36 @@
 ard%0A            
+    
 %7D%0A            if
@@ -1271,32 +1271,36 @@
   %7D%0A            
+ 
+   
 if (i %3E= 4) %7B%0A  
@@ -1293,24 +1293,28 @@
  (i %3E= 4) %7B%0A
+    
             
@@ -1388,32 +1388,36 @@
                 
+    
 return true; // 
@@ -1463,34 +1463,42 @@
                 
+  
-%7D%0A
+  %7D%0A    
             %7D%0A  
@@ -1499,32 +1499,36 @@
   %7D%0A            
+ 
+   
 if (i %3E= 5) %7B%0A  
@@ -1533,32 +1533,36 @@
                 
+   
+ 
 if (x%5Bi - 2%5D - x
@@ -1573,16 +1573,40 @@
  4%5D %3E= 0
+%0A                       
  && x%5Bi%5D
@@ -1628,16 +1628,40 @@
 x%5Bi - 4%5D
+%0A                       
  && x%5Bi 
@@ -1687,16 +1687,40 @@
 x%5Bi - 5%5D
+%0A                       
  && x%5Bi 
@@ -1731,32 +1731,36 @@
  %3C= x%5Bi - 3%5D) %7B%0A
+    
                 
@@ -1829,34 +1829,42 @@
                 
+ 
-%7D%0A
+   %7D%0A    
             %7D%0A  
@@ -1869,26 +1869,32 @@
         
-%7D%0A
+    %7D%0A  
         
 return f
@@ -1877,32 +1877,34 @@
     %7D%0A          
+  
 return false;%0A  
@@ -1897,20 +1897,30 @@
 turn false;%0A
+        %7D%0A
     %7D%0A%7D%0A

refactor 335