Skip to content

Commit 7ee2589

Browse files
committed
feat: add solutions to lc problem: No.1649
No.1649.Create Sorted Array through Instructions
1 parent 4f9aed4 commit 7ee2589

File tree

2 files changed

+460
-2
lines changed

2 files changed

+460
-2
lines changed

solution/1600-1699/1649.Create Sorted Array through Instructions/README.md

Lines changed: 232 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474

7575
<!-- 这里可写通用的实现逻辑 -->
7676

77-
树状数组
77+
**方法一:树状数组**
7878

7979
树状数组,也称作“二叉索引树”(Binary Indexed Tree)或 Fenwick 树。 它可以高效地实现如下两个操作:
8080

@@ -89,12 +89,18 @@
8989

9090
解决方案是直接遍历数组,每个位置先求出 `query(a[i])`,然后再修改树状数组 `update(a[i], 1)` 即可。当数的范围比较大时,需要进行离散化,即先进行去重并排序,然后对每个数字进行编号。
9191

92+
**方法二:线段树**
93+
94+
Python3 代码 TLE,Java、C++ 代码 AC。
95+
9296
<!-- tabs:start -->
9397

9498
### **Python3**
9599

96100
<!-- 这里可写当前语言的特殊实现逻辑 -->
97101

102+
树状数组:
103+
98104
```python
99105
class BinaryIndexedTree:
100106
def __init__(self, n):
@@ -131,10 +137,73 @@ class Solution:
131137
return ans % int((1e9 + 7))
132138
```
133139

140+
线段树:
141+
142+
```python
143+
class Node:
144+
def __init__(self):
145+
self.l = 0
146+
self.r = 0
147+
self.v = 0
148+
149+
class SegmentTree:
150+
def __init__(self, n):
151+
self.tr = [Node() for _ in range(4 * n)]
152+
self.build(1, 1, n)
153+
154+
def build(self, u, l, r):
155+
self.tr[u].l = l
156+
self.tr[u].r = r
157+
if l == r:
158+
return
159+
mid = (l + r) >> 1
160+
self.build(u << 1, l, mid)
161+
self.build(u << 1 | 1, mid + 1, r)
162+
163+
def modify(self, u, x, v):
164+
if self.tr[u].l == x and self.tr[u].r == x:
165+
self.tr[u].v += v
166+
return
167+
mid = (self.tr[u].l + self.tr[u].r) >> 1
168+
if x <= mid:
169+
self.modify(u << 1, x, v)
170+
else:
171+
self.modify(u << 1 | 1, x, v)
172+
self.pushup(u)
173+
174+
def pushup(self, u):
175+
self.tr[u].v = self.tr[u << 1].v + self.tr[u << 1 | 1].v
176+
177+
def query(self, u, l, r):
178+
if self.tr[u].l >= l and self.tr[u].r <= r:
179+
return self.tr[u].v
180+
mid = (self.tr[u].l + self.tr[u].r) >> 1
181+
v = 0
182+
if l <= mid:
183+
v = self.query(u << 1, l, r)
184+
if r > mid:
185+
v += self.query(u << 1 | 1, l, r)
186+
return v
187+
188+
class Solution:
189+
def createSortedArray(self, instructions: List[int]) -> int:
190+
n = max(instructions)
191+
tree = SegmentTree(n)
192+
ans = 0
193+
for num in instructions:
194+
a = tree.query(1, 1, num - 1)
195+
b = tree.query(1, 1, n) - tree.query(1, 1, num)
196+
ans += min(a, b)
197+
tree.modify(1, num, 1)
198+
return ans % int((1e9 + 7))
199+
```
200+
134201
### **Java**
135202

136203
<!-- 这里可写当前语言的特殊实现逻辑 -->
137204

205+
树状数组:
206+
138207
```java
139208
class Solution {
140209
public int createSortedArray(int[] instructions) {
@@ -184,8 +253,93 @@ class BinaryIndexedTree {
184253
}
185254
```
186255

256+
线段树:
257+
258+
```java
259+
class Solution {
260+
public int createSortedArray(int[] instructions) {
261+
int n = 100010;
262+
int mod = (int) 1e9 + 7;
263+
SegmentTree tree = new SegmentTree(n);
264+
int ans = 0;
265+
for (int num : instructions) {
266+
int a = tree.query(1, 1, num - 1);
267+
int b = tree.query(1, 1, n) - tree.query(1, 1, num);
268+
ans += Math.min(a, b);
269+
ans %= mod;
270+
tree.modify(1, num, 1);
271+
}
272+
return ans;
273+
}
274+
}
275+
276+
class Node {
277+
int l;
278+
int r;
279+
int v;
280+
}
281+
282+
class SegmentTree {
283+
private Node[] tr;
284+
285+
public SegmentTree(int n) {
286+
tr = new Node[4 * n];
287+
for (int i = 0; i < tr.length; ++i) {
288+
tr[i] = new Node();
289+
}
290+
build(1, 1, n);
291+
}
292+
293+
public void build(int u, int l, int r) {
294+
tr[u].l = l;
295+
tr[u].r = r;
296+
if (l == r) {
297+
return;
298+
}
299+
int mid = (l + r) >> 1;
300+
build(u << 1, l, mid);
301+
build(u << 1 | 1, mid + 1, r);
302+
}
303+
304+
public void modify(int u, int x, int v) {
305+
if (tr[u].l == x && tr[u].r == x) {
306+
tr[u].v += v;
307+
return;
308+
}
309+
int mid = (tr[u].l + tr[u].r) >> 1;
310+
if (x <= mid) {
311+
modify(u << 1, x, v);
312+
} else {
313+
modify(u << 1 | 1, x, v);
314+
}
315+
pushup(u);
316+
}
317+
318+
public void pushup(int u) {
319+
tr[u].v = tr[u << 1].v + tr[u << 1 | 1].v;
320+
}
321+
322+
public int query(int u, int l, int r) {
323+
if (tr[u].l >= l && tr[u].r <= r) {
324+
return tr[u].v;
325+
}
326+
int mid = (tr[u].l + tr[u].r) >> 1;
327+
int v = 0;
328+
if (l <= mid) {
329+
v += query(u << 1, l, r);
330+
}
331+
if (r > mid) {
332+
v += query(u << 1 | 1, l, r);
333+
}
334+
return v;
335+
}
336+
}
337+
```
338+
187339
### **C++**
188340

341+
树状数组:
342+
189343
```cpp
190344
class BinaryIndexedTree {
191345
public:
@@ -237,8 +391,85 @@ public:
237391
};
238392
```
239393
394+
线段树:
395+
396+
```cpp
397+
class Node {
398+
public:
399+
int l;
400+
int r;
401+
int v;
402+
};
403+
404+
class SegmentTree {
405+
public:
406+
vector<Node*> tr;
407+
408+
SegmentTree(int n) {
409+
tr.resize(4 * n);
410+
for (int i = 0; i < tr.size(); ++i) tr[i] = new Node();
411+
build(1, 1, n);
412+
}
413+
414+
void build(int u, int l, int r) {
415+
tr[u]->l = l;
416+
tr[u]->r = r;
417+
if (l == r) return;
418+
int mid = (l + r) >> 1;
419+
build(u << 1, l, mid);
420+
build(u << 1 | 1, mid + 1, r);
421+
}
422+
423+
void modify(int u, int x, int v) {
424+
if (tr[u]->l == x && tr[u]->r == x)
425+
{
426+
tr[u]->v += v;
427+
return;
428+
}
429+
int mid = (tr[u]->l + tr[u]->r) >> 1;
430+
if (x <= mid) modify(u << 1, x, v);
431+
else modify(u << 1 | 1, x, v);
432+
pushup(u);
433+
}
434+
435+
void pushup(int u) {
436+
tr[u]->v = tr[u << 1]->v + tr[u << 1 | 1]->v;
437+
}
438+
439+
int query(int u, int l, int r) {
440+
if (tr[u]->l >= l && tr[u]->r <= r) return tr[u]->v;
441+
int mid = (tr[u]->l + tr[u]->r) >> 1;
442+
int v = 0;
443+
if (l <= mid) v = query(u << 1, l, r);
444+
if (r > mid) v += query(u << 1 | 1, l, r);
445+
return v;
446+
}
447+
};
448+
449+
class Solution {
450+
public:
451+
int createSortedArray(vector<int>& instructions) {
452+
int n = *max_element(instructions.begin(), instructions.end());
453+
int mod = 1e9 + 7;
454+
SegmentTree* tree = new SegmentTree(n);
455+
int ans = 0;
456+
for (int num : instructions)
457+
{
458+
int a = tree->query(1, 1, num - 1);
459+
int b = tree->query(1, 1, n) - tree->query(1, 1, num);
460+
ans += min(a, b);
461+
ans %= mod;
462+
tree->modify(1, num, 1);
463+
}
464+
return ans;
465+
}
466+
};
467+
```
468+
240469
### **Go**
241470

471+
树状数组:
472+
242473
```go
243474
type BinaryIndexedTree struct {
244475
n int

0 commit comments

Comments
 (0)