Skip to content

Commit 8d6e857

Browse files
author
ruislan
committed
updated q335
1 parent 30812d9 commit 8d6e857

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

src/q/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ mod q327;
190190
mod q328;
191191
mod q330;
192192
mod q331;
193+
mod q335;
193194
mod q338;
194195
mod q341;
195196
mod q342;

src/q/q335.rs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
use crate::q::Solution;
2+
3+
#[allow(unused)]
4+
impl Solution {
5+
pub fn is_self_crossing(distance: Vec<i32>) -> bool {
6+
// 方法1:
7+
// 经过的每个点都存储到hashmap里面?如果再次经过就表示map中存在?
8+
// 变量:
9+
// 1. 当前点
10+
// 2. 当前方向
11+
// 3. 经过的点的hashset
12+
// 逻辑:
13+
// 迭代distance,然后处理起止位置上的每个点,如果存在点,就返回真
14+
// 复杂度: O(n^2)。10^5 * 10^5
15+
// 结论: 可能会超时
16+
// Not AC ,超时 28/29
17+
// use std::collections::HashSet;
18+
// #[derive(Clone, Copy)]
19+
// enum Direction { N, W, S, E }
20+
// let mut set = HashSet::new();
21+
// let mut cur = (0, 0);
22+
// set.insert(cur);
23+
// let mut direction = Direction::N;
24+
// for i in 0..distance.len() {
25+
// let mut base = (0, 0);
26+
// match direction {
27+
// Direction::N => {
28+
// base = (0, 1);
29+
// direction = Direction::W;
30+
// }
31+
// Direction::W => {
32+
// base = (-1, 0);
33+
// direction = Direction::S;
34+
// }
35+
// Direction::S => {
36+
// base = (0, -1);
37+
// direction = Direction::E;
38+
// }
39+
// Direction::E => {
40+
// base = (1, 0);
41+
// direction = Direction::N;
42+
// }
43+
// };
44+
// for _ in 0..distance[i] {
45+
// cur.0 += base.0;
46+
// cur.1 += base.1;
47+
// if !set.insert(cur) {
48+
// return true;
49+
// }
50+
// }
51+
// }
52+
// false
53+
54+
// 方法2
55+
// 我们注意到它始终是逆时针走的,也就是说相交的情况是可以分情况处理的
56+
// 其实画画图,就能发现,只有三种情况是相交的,
57+
// 情况1,左穿右,如果i-1<=i-3,i>=i-2,就相交
58+
// -----
59+
// | |
60+
// | |
61+
// |---|--
62+
// /
63+
// 情况2,下穿上,如果提前转向,那么一定会相交,如果刚好相等,也会相交,如果超过,则不会
64+
// 这里会有5条线 i..i-4。 如果i+(i-4) >= i-2并且 i-1 == i-3才可以
65+
// (i-3)
66+
// -----
67+
// | |
68+
//(i-2)| | (i-4)
69+
// |
70+
// |---| (i)
71+
// (i-1)
72+
// 情况3,右穿左,这里就是情况2不相交的情况,最后一次要相交的情况
73+
// 这里会有6条线 i..i-5。 可以看出来要相交那么 i + i-4 >= i-2 并且 i-1 + i-5 >= i-3 并且 i - 1 <= i-3 并且 i-2 > i-4
74+
// (i-4)
75+
// ----- i
76+
// | | ------|
77+
//(i-3)| | (i-5) |(i-1)
78+
// | |
79+
// |----------------
80+
// (i-2)
81+
// 再往后,其实就会出现已经归纳的情况,这样所有的情况都照顾到了
82+
// AC 0ms 2.9mb
83+
// P.S 突然发现很像判断只能逆时针操作的贪吃蛇是否Game Over
84+
let n = distance.len();
85+
if n < 4 { return false; }
86+
for i in 3..n {
87+
if distance[i] >= distance[i - 2] && distance[i - 1] <= distance[i - 3] { return true; }
88+
if i >= 4 && distance[i - 1] == distance[i - 3] && distance[i] + distance[i - 4] >= distance[i - 2] { return true; }
89+
if i >= 5 && distance[i - 1] <= distance[i - 3] && distance[i - 2] > distance[i - 4] && distance[i] + distance[i - 4] >= distance[i - 2] && distance[i - 1] + distance[i - 5] >= distance[i - 3] { return true; }
90+
}
91+
false
92+
}
93+
}

0 commit comments

Comments
 (0)