leetcode 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:

┌───┐
│   │
└───┼──>
    │

Input: [2,1,1,2]
Output: true

Example 2:

┌──────┐
│      │
│
│
└────────────>

Input: [1,2,3,4]
Output: false 

Example 3:

┌───┐
│   │
└───┼>

Input: [1,1,1,1]
Output: true 

题目 检测是否会撞到自己。

我们可以分为3个状态处理:

  1. 第一阶段外旋转扩张。不可能碰壁
  2. 向内旋转换。可能碰壁
  3. 内旋。只需要检测倒数第一条边和倒数第3条边的长

剩下的就简单了,代码如下:

/*
@Author PaladinDu
*/
bool isSelfCrossing(int* x, int xSize){
    /*
    1.第一阶段外旋转扩张。不可能碰壁
    2.向内旋转换。可能碰壁
    3.内旋。只需要检测倒数第一条边和倒数第3条边的长
    */
    for(int i = 3;i < xSize;++i){
        if (x[i-1] <= x[i-3]){//进入第二阶段
            if(x[i] >= x[i-2] ||(((i>=4 && x[i-1] == x[i-3] )||(i>=5 &&x[i-1]+x[i-5]>=x[i-3]) )&&x[i]+x[i-4]>=x[i-2])){//检测是否第二阶段撞墙
                return true;
            }
            for(i = i+1;i < xSize;++i){//检测内旋是否碰壁
                if(x[i] >= x[i-2]){
                    return true;
                }
            }
            return false;
        }
    }
    return false;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值