MayUWell

Learn, Sleep, Learn

335-自交叉

Descritpion:

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)

问题描述

给定一个正整数数组x。从(0, 0)出发,向北走x[0],向西走x[1],向南走x[2],向东走x[3],向北走x[4],依次类推…换言之,每次逆时针改变运动方向。

写出一个单次循环判断路径是否相交的算法,注意空间复杂度为O(1)


问题分析

可以看看这个链接:
https://leetcode.com/problems/self-crossing/discuss/79141/Another-python

这张图很形象
这里写图片描述

6个点为一组,判断是否相交。

以第一轮为例,判断d是否与a相交。判断f是否与a相交


解法

class Solution {
    public boolean isSelfCrossing(int[] x) {
        int len = x.length;

        if(len <= 3)    return false;
        //每轮迭代,六个点对应更新
        for(int i = 3;i < len;i++){
            //判断d是否与a相交
            if(x[i] >= x[i - 2] && x[i - 3] >= x[i - 1])    return true;
            //判断e是否与a相交
            if(i >= 4){
                if(x[i - 1] == x[i - 3] && x[i] + x[i - 4] == x[i - 2]) return true;
            }
            //判断f是否与a相交
            if(i >= 5){
                if(x[i - 2] >= x[i - 4] && 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;
            }
        }

        return false;
    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LaputaFallen/article/details/79949895
个人分类: 算法与数据结构
所属专栏: leetcode全解
上一篇76-最小窗口子串
下一篇45-跳跃游戏II
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭