[leetcode]335. Self Crossing
You are given an array x of n positive numbers. You start at point (,) and moves x[] metres to the north, then x[] metres to the west, x[] metres to the south, x[] 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() extra space to determine, if your path crosses itself, or not. Example :
Given x =
[, , , ]
,
┌───┐
│ │
└───┼──>
│ Return true (self crossing)
Example :
Given x =
[, , , ]
,
┌──────┐
│ │
│
│
└────────────> Return false (not self crossing)
Example :
Given x =
[, , , ]
,
┌───┐
│ │
└───┼> Return true (self crossing)
题目说有一串数x,是一些移动轨迹,从逆时针往北开始走过x[i]长度,说走过的这些轨迹会有相交吗?
一开始以为就四个数,然后判断一波就行了,没想到这里面有坑,x是不定长数组,因此不是走四次就结束了,是要把数组都判断一遍才可以。
对于这个问题,可以这么考虑,分为len(x)<4,len(x)==4,len(x)>4的。
len(x)<4 显然不相交;
len(x)==4, 只有x[2]<=x[0] && x[3]>=x[1]才有可能相交;
len(x)>4时,
我们考虑相交的相反情况,我们找不相交的情况,不相交主要有两种状态,外旋跟内旋,看下图
初始判断进入哪个状态是在x[3]决定,x[3]>x[1]->状态1,x[3]<x[1]->状态2,x[3]==x[1]时比较特殊,要再判断一下x[4]+x[0]>=x[2]是否成立,成立则相交,否则进入状态2。
情况1就是外旋,为了保持外旋的状态,x[i]需要大于x[i-2],由情况3可以看出来,若x[i]<=x[i-2],那么下一个x[i](如果存在),要么变成内旋,要么就相交,所以除非x[i]>x[i-2]能一致保持外旋的状态,否则就要进入中间状态,这里称为状态3。
状态3是为了判断相交或进入状态2而准备的,也就是说在情况3中x[i==6]这步由于x[6]<x[4]所以要进入中间状态了,而且这里要注意根据x[6]的长度,若x[6]+x[2]<x[4]那么下一刻x[7]若相交则只会跟x[4]相交,x[7]必须>x[5],而若x[6]+x[2]>=x[4]那么x[7]+x[3]>x[5]就会导致相交,若不相交,则x[8]开始就会进入状态2。
情况2中,内旋判断x[i]是否会相交只要判断x[i]>x[i-2]成立,就相交。
因此总结起来:
if len(x) <4 then false
if len(x)==4 && x[0] > 0 and x[2] <= x[0] and x[1] > 0 and x[3] >= x[1] then true
if len(x)>5:
当前状态1:若x[i]<=x[i-2]那么根据x[i]长度进入不同的状态3
当前状态2:若x[i]>=x[i-2]=>相交
当前状态3:根据状态3的两种不同情况和x[i]长度判断是相交还是进入状态2
代码如下:
class Solution(object):
def isSelfCrossing(self, x):
"""
:type x: List[int]
:rtype: bool
"""
if (len(x) < 4):
return False
if (x[0] > 0 and x[2] <= x[0] and x[1] > 0 and x[3] >= x[1]):
return True
if (len(x) < 5):
return False
statu = 0
juage = -1
if (x[3] > x[1]):
statu = 1
if (x[3] < x[1]):
statu = 2
if (x[3] == x[1]):
if(x[4] + x[0]) >= x[2]:
return True
else:
statu = 2
for i in range(4, len(x)):
if statu == 1:
if (x[i] <= x[i - 2]):
statu = 0
if (x[i - 4] + x[i] >= x[i - 2]):
juage = 1
continue
else:
juage = 2
continue if statu == 2:
if (x[i] >= x[i - 2]):
return True
if juage != -1:
if juage == 1:
if (x[i] + x[i - 4] < x[i - 2]):
statu = 2
juage = -1
else:
return True
if juage == 2:
if (x[i] < x[i - 2]):
statu = 2
juage = -1
else:
return True
return False
[leetcode]335. Self Crossing的更多相关文章
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
- 335. Self Crossing
/* * 335. Self Crossing * 2016-7-10 by Mingyang */ // Categorize the self-crossing scenarios, there ...
- 【LeetCode】Self Crossing(335)
1. Description You are given an array x of n positive numbers. You start at point (0,0) and moves x[ ...
- 【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] metr ...
- Java实现 LeetCode 335 路径交叉
335. 路径交叉 给定一个含有 n 个正数的数组 x.从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动.也就是说 ...
- Leetcode 335.路径交叉
路径交叉 给定一个含有 n 个正数的数组 x.从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动.也就是说,每次移动 ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
随机推荐
- C语言打印杨辉三角(2种方法)
杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一. ...
- 无法对含有多个.java(或.class)文档的程序进行编译(或解释)
通常初学者会出现这样的问题:无法对含有多个.java(或.class)文档的程序进行编译(或解释). root@yogile-VirtualBox:/alive/string# javac work/ ...
- centos7共享文件夹到windows访问--samba
第一步:安装samba服务 yum install samba 第二步:启动samba服务 systemctl start smb 查看samba的状态 systemctl status smb 看到 ...
- FreeSWITCH添加中文语音
1.准备中文语音包 可以到freeswitch官网下载,也可以自己录制 2.中文资源的安装路径: 英文资源的路径为conf/sounds/en/us/callie/... 类似的设置中文资源的路径 ...
- Python全栈之路----函数进阶----生成器
生成器特点: 不能立即产生,取一次创建一次 只能往前走 等到走到最后,就会报错 >>> a = [i for i in range(1000)] >>> a [0, ...
- CSS3 transform变形(3D转换)
一.三维坐标 空间中三维坐标如下图所示: 向上为-Y,向下为+Y,向左为-X,向右为+X,向前为+Z,向后为-Z. 二.perspective(n)为 3D 转换元素定义透视视图 perspectiv ...
- Python Json & Pickle模块
用于序列化的两个模块 Json,用于字符串 和 python数据类型间进行转换 Pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
- Linux scp命令详解
Linux scp命令 Linux scp命令用于Linux之间复制文件和目录. scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 语法: ...
- docker安装solr集群5.3.1
docker-compose.yml: version: '3' services: zookeeper-A: image: zookeeper:3.4.11 ports: - "12181 ...
- git初始化本地项目及关联github远程库
一.初始化本地项目 idea中在项目文件夹下执行:git init . 二.在github官网上创建一个库 三.执行如下命令关联远程库: git remote add origin 你创建的git远程 ...