-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathasteroid_collision.dart
142 lines (112 loc) · 3.54 KB
/
asteroid_collision.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
-* 735. Asteroid Collision *-
We are given an array asteroids of integers representing asteroids in a row.
For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning right, negative meaning left). Each asteroid moves at the same speed.
Find out the state of the asteroids after all collisions. If two asteroids meet, the smaller one will explode. If both are the same size, both will explode. Two asteroids moving in the same direction will never meet.
Example 1:
Input: asteroids = [5,10,-5]
Output: [5,10]
Explanation: The 10 and -5 collide resulting in 10. The 5 and 10 never collide.
Example 2:
Input: asteroids = [8,-8]
Output: []
Explanation: The 8 and -8 collide exploding each other.
Example 3:
Input: asteroids = [10,2,-5]
Output: [10]
Explanation: The 2 and -5 collide resulting in -5. The 10 and -5 collide resulting in 10.
Constraints:
2 <= asteroids.length <= 104
-1000 <= asteroids[i] <= 1000
asteroids[i] != 0
*/
// Iteration
class A {
List<int> asteroidCollision(List<int> asteroids) {
final int n = asteroids.length;
int j = 0;
for (int i = 0; i < n; i++) {
final int asteroid = asteroids[i];
while (j > 0 &&
asteroids[j - 1] > 0 &&
asteroid < 0 &&
asteroids[j - 1] < asteroid.abs()) {
j--;
}
if (j == 0 || asteroid > 0 || asteroids[j - 1] < 0) {
asteroids[j++] = asteroid;
} else if (asteroids[j - 1] == asteroid.abs()) {
j--;
}
}
final List<int> result = List<int>.from(asteroids.sublist(0, j));
return result;
}
}
// Doubly Linked List
class ListNode {
int val;
bool pos;
ListNode? next;
ListNode? prev;
ListNode({this.next, this.prev, this.val = 0, this.pos = false});
}
class Solution {
List<int> asteroidCollision(List<int> a) {
final ListNode head = ListNode(pos: false);
ListNode current = head;
final int n = a.length;
for (int i = 0; i < n; ++i) {
final ListNode node = ListNode(val: a[i].abs(), pos: a[i] > 0);
current.next = node;
node.prev = current;
current = node;
}
final ListNode tail = ListNode(pos: true);
current.next = tail;
tail.prev = current;
current = head;
while (current != tail) {
if (current.pos) {
ListNode nextNode = current.next!;
if (nextNode.pos) {
current = nextNode;
} else {
if (nextNode.val == current.val) {
final ListNode prevNode = current.prev!;
// var delete1 = current;
final ListNode delete2 = current.next!;
nextNode = delete2.next!;
prevNode.next = nextNode;
nextNode.prev = prevNode;
current = prevNode;
} else if (nextNode.val > current.val) {
final ListNode prevNode = current.prev!;
prevNode.next = nextNode;
nextNode.prev = prevNode;
// var toDelete = current;
if (prevNode.pos)
current = current.prev!;
else
current = current.next!;
} else {
// var toDelete = nextNode;
nextNode = nextNode.next!;
current.next = nextNode;
nextNode.prev = current;
}
}
} else {
current = current.next!;
}
}
final List<int> ans = [];
current = head.next!;
while (current != tail) {
final int value = current.pos ? current.val : -current.val;
ans.add(value);
current = current.next!;
}
return ans;
}
}