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步是等价的,所以只需讨论三种情况即可。(画图太渣,还是传手写照片吧)
![](http://img.blog.csdn.net/20160531201444407)
需注意情况3中第一个条件是没有等号的,如果取等则变为情况2!
源码:(language:java)
成绩:
0ms,beats 43.49%,众数0ms,56.51%
Cmershen的碎碎念:
本算法简洁优美,堪称绝妙!还有,高中的平面向量还记得么~~
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的碎碎念:
本算法简洁优美,堪称绝妙!还有,高中的平面向量还记得么~~
相关文章推荐
- Android图像处理(一)色调、饱和度、亮度
- iOS库的介绍以及如何使用CocoaPods管理库(2016最新版本)
- IOS面试题
- 地图 大头针
- C 字符串中sizeof() 和 strlen()
- 工资数组类
- HDU 4568 Hunter
- Guice 注入--(privateModule,intall(),expose())
- CF_602A - Two Bases(进制转换—水题)
- HTML5+CSS3-第二节(浏览器前缀、css新特征、文本溢出、新的颜色设定、透明设定、文本填充色、文本边框色、圆角)
- peda的帮助文档(自己翻译)
- 在Android应用中使用自定义证书的HTTPS连接(下)
- 练习三 Problem T
- 二分图匈牙利算法模板
- [置顶] android.support.v7.widget.SearchView开发记录(一)
- HTML5+CSS3-第一节(文档类型声明、新增标签)
- Hat's Fibonacci
- Middle-题目122:220. Contains Duplicate III
- linux搭建zookeeper集群
- Hadoop基础之HDFS