您的位置:首页 > 其它

Middle-题目123:335. Self Crossing

2016-05-31 20:16 302 查看
题目原文:

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,你从坐标系原点开始走,向上走x[0]米,再向左走x[1]米,再向下走x[2]米,再向下走x[3]米,以此类推的逆时针走,判断运动轨迹是否相交。

题目分析:

参考了discuss中一位大神的算法,解释如下:

首先,只走3步是不可能产生交点的,所以考虑走4步,走5步,走6步产生交点的情况,而走7步与走5步是等价的,所以只需讨论三种情况即可。(画图太渣,还是传手写照片吧)



需注意情况3中第一个条件是没有等号的,如果取等则变为情况2!

源码:(language:java)

public class Solution {
public boolean isSelfCrossing(int[] x) {
for(int i=3;i<x.length;i++){
if(i>=3&&x[i]>=x[i-2]&&x[i-1]<=x[i-3])
return true;
if(i>=4&&x[i-1]==x[i-3]&&x[i-2]<=x[i]+x[i-4])
return true;
if(i>=5&&x[i-2]>x[i-4]&&x[i-1]<=x[i-3]&&x[i-1]+x[i-5]>=x[i-3]&&x[i]+x[i-4]>=x[i-2])
return true;
}
return false;
}
}


成绩:

0ms,beats 43.49%,众数0ms,56.51%

Cmershen的碎碎念:

本算法简洁优美,堪称绝妙!还有,高中的平面向量还记得么~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: