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