【LeetCode】335. Self Crossing(python)

Problem: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)

这题做得很狼狈啊呜哇啊啊啊!

思路来得蛮快的,因为cross的情况一共就三种,4弯cross,5个弯cross和6个弯cross:

#4个弯          5个弯            6个弯

  1              1                1
┌───┐          ┌───┐            ┌───┐
│2  │0         │2  │0           │   │0
└───┼>         │   ↑            │2  │←┐
  3            └───┘5           │   5 │4 
                 4              └─────┘
                                   3

根据上图写出三种情况的判断式,这里错了好几次,第三种情况总是少了条件= - =

Code:

def isSelfCrossing(self, x):
        l = (len(x))
        iscross = False
        if l < 4: return False
        for i in range(3, l):
            #情况1
            if x[i-3]>=x[i-1] and x[i-2]<=x[i]:
                return True
            #情况2
            if i>=4 and x[i-4]+x[i]>=x[i-2] and x[i-3]==x[i-1]:
                return True
            #情况3 
            if i>=5 and x[i-5]+x[i-1]>=x[i-3] and x[i-4]+x[i]>=x[i-2] and x[i-2]>=x[i-4] and x[i-2]>x[i-4] and x[i-3]>x[i-5] and x[i-1]<x[i-3]:
                return True
            iscross = False
        return iscross    

很粗暴的解法,第三种写了辣么长,不过好歹AC了。

围观别人家的代码:

class Solution(object):
    def isSelfCrossing(self, x):
         return any(d >= b > 0 and (a >= c or a >= c-e >= 0 and f >= d-b)
               for a, b, c, d, e, f in ((x[i:i+6] + [0] * 6)[:6]
                                        for i in xrange(len(x))))

 ②

class Solution(object):
    def isSelfCrossing(self, x):
        n = len(x)
        x.append(0.5)        # let x[-1] = 0.5
        if n < 4: return False
        grow = x[2] > x[0]

        for i in range(3,n):
            if not grow and x[i] >= x[i-2]: return True
            if grow and x[i] <= x[i-2]:
                grow = False
                if x[i] + x[i-4] >= x[i-2]:
                    x[i-1] -= x[i-3]
        return False

 对python的一些用法还是不够熟悉,毕竟第一门学的是C,写出来总是看着很繁琐。相比其他语言,python的代码都能缩到超短,多加练习啦~

原文地址:https://www.cnblogs.com/liez/p/5415307.html