Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b3d9353

Browse files
committed
feat: add solutions to lc problem: No.1054
No.1054.Distant Barcodes
1 parent 70a7f19 commit b3d9353

File tree

7 files changed

+222
-262
lines changed

7 files changed

+222
-262
lines changed

‎solution/1000-1099/1054.Distant Barcodes/README.md‎

Lines changed: 77 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,13 @@
3838

3939
<!-- 这里可写通用的实现逻辑 -->
4040

41-
**方法一:贪心 + 哈希表 + 优先队列(大根堆)**
41+
**方法一:计数 + 排序**
4242

43-
先用哈希表 `cnt` 统计每种条形码的数量,然后将每种条形码及其数量存入优先队列(大根堆) 中,优先队列中的元素按照条形码数量从大到小排序
43+
我们先用哈希表或数组 $cnt$ 统计数组 $barcodes$ 中各个数出现的次数,然后将 $barcodes$ 中的数按照它们在 $cnt$ 中出现的次数从大到小排序,如果出现次数相同,那么就按照数的大小从小到大排序(确保相同的数相邻)
4444

45-
重排条形码时,我们每次从堆顶弹出一个元素 `(v, k)`,将 `k` 添加到结果数组中,并将 `(v-1, k)` 放入队列 `q` 中。当队列长度大于 1ドル$ 时,弹出队首元素 `p`,若此时 `p.v` 大于 0ドル,ドル则将 `p` 放入堆中。循环,直至堆为空
45+
接下来,我们创建一个长度为 $n$ 的答案数组 $ans,ドル然后遍历排好序的 $barcodes,ドル将元素依次填入答案数组的 0,ドル 2, 4, \cdots$ 等偶数下标位置,然后将剩余元素依次填入答案数组的 1ドル, 3, 5, \cdots$ 等奇数下标位置即可
4646

47-
时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(n)$。其中 $n$ 为条形码数组的长度。
48-
49-
相似题目:[767. 重构字符串](/solution/0700-0799/0767.Reorganize%20String/README.md)
47+
时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(M)$。其中 $n$ 和 $M$ 分别是数组 $barcodes$ 的长度以及数组 $barcodes$ 中的最大值。
5048

5149
<!-- tabs:start -->
5250

@@ -58,18 +56,11 @@
5856
class Solution:
5957
def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
6058
cnt = Counter(barcodes)
61-
h = [(-v, k) for k, v in cnt.items()]
62-
heapify(h)
63-
q = deque()
64-
ans = []
65-
while h:
66-
v, k = heappop(h)
67-
ans.append(k)
68-
q.append((v + 1, k))
69-
while len(q) > 1:
70-
p = q.popleft()
71-
if p[0]:
72-
heappush(h, p)
59+
barcodes.sort(key=lambda x: (-cnt[x], x))
60+
n = len(barcodes)
61+
ans = [0] * len(barcodes)
62+
ans[::2] = barcodes[: (n + 1) // 2]
63+
ans[1::2] = barcodes[(n + 1) // 2:]
7364
return ans
7465
```
7566

@@ -80,27 +71,22 @@ class Solution:
8071
```java
8172
class Solution {
8273
public int[] rearrangeBarcodes(int[] barcodes) {
83-
Map<Integer, Integer> cnt = new HashMap<>();
84-
for (int v : barcodes) {
85-
cnt.put(v, cnt.getOrDefault(v, 0) + 1);
74+
int n = barcodes.length;
75+
Integer[] t = new Integer[n];
76+
int mx = 0;
77+
for (int i = 0; i < n; ++i) {
78+
t[i] = barcodes[i];
79+
mx = Math.max(mx, barcodes[i]);
8680
}
87-
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[1] - a[1]);
88-
for (var e : cnt.entrySet()) {
89-
pq.offer(newint[] {e.getKey(), e.getValue()});
81+
int[] cnt = new int[mx +1];
82+
for (int x : barcodes) {
83+
++cnt[x];
9084
}
91-
Deque<int[]> q = new ArrayDeque<>();
92-
int[] ans = new int[barcodes.length];
93-
int i = 0;
94-
while (!pq.isEmpty()) {
95-
var p = pq.poll();
96-
ans[i++] = p[0];
97-
p[1]--;
98-
q.offer(p);
99-
while (q.size() > 1) {
100-
p = q.pollFirst();
101-
if (p[1] > 0) {
102-
pq.offer(p);
103-
}
85+
Arrays.sort(t, (a, b) -> cnt[a] == cnt[b] ? a - b : cnt[b] - cnt[a]);
86+
int[] ans = new int[n];
87+
for (int k = 0, j = 0; k < 2; ++k) {
88+
for (int i = k; i < n; i += 2) {
89+
ans[i] = t[j++];
10490
}
10591
}
10692
return ans;
@@ -111,33 +97,23 @@ class Solution {
11197
### **C++**
11298

11399
```cpp
114-
using pii = pair<int, int>;
115-
116100
class Solution {
117101
public:
118102
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
119-
unordered_map<int, int> cnt;
120-
for (auto& v : barcodes) {
121-
++cnt[v];
122-
}
123-
priority_queue<pii> pq;
124-
for (auto& [k, v] : cnt) {
125-
pq.push({v, k});
103+
int mx = *max_element(barcodes.begin(), barcodes.end());
104+
int cnt[mx + 1];
105+
memset(cnt, 0, sizeof(cnt));
106+
for (int x : barcodes) {
107+
++cnt[x];
126108
}
127-
vector<int> ans;
128-
queue<pii> q;
129-
while (pq.size()) {
130-
auto p = pq.top();
131-
pq.pop();
132-
ans.push_back(p.second);
133-
p.first--;
134-
q.push(p);
135-
while (q.size() > 1) {
136-
p = q.front();
137-
q.pop();
138-
if (p.first) {
139-
pq.push(p);
140-
}
109+
sort(barcodes.begin(), barcodes.end(), [&](int a, int b) {
110+
return cnt[a] > cnt[b] || (cnt[a] == cnt[b] && a < b);
111+
});
112+
int n = barcodes.size();
113+
vector<int> ans(n);
114+
for (int k = 0, j = 0; k < 2; ++k) {
115+
for (int i = k; i < n; i += 2) {
116+
ans[i] = barcodes[j++];
141117
}
142118
}
143119
return ans;
@@ -149,47 +125,58 @@ public:
149125
150126
```go
151127
func rearrangeBarcodes(barcodes []int) []int {
152-
cnt := map[int]int{}
153-
for _, v := range barcodes {
154-
cnt[v]++
128+
mx := 0
129+
for _, x := range barcodes {
130+
mx = max(mx, x)
155131
}
156-
pq := hp{}
157-
for k, v := range cnt {
158-
heap.Push(&pq, pair{v, k})
132+
cnt := make([]int, mx+1)
133+
for _, x := range barcodes {
134+
cnt[x]++
159135
}
160-
ans := []int{}
161-
q := []pair{}
162-
for len(pq) > 0 {
163-
p := heap.Pop(&pq).(pair)
164-
v, k := p.v, p.k
165-
ans = append(ans, k)
166-
q = append(q, pair{v - 1, k})
167-
for len(q) > 1 {
168-
p = q[0]
169-
q = q[1:]
170-
if p.v > 0 {
171-
heap.Push(&pq, p)
172-
}
136+
sort.Slice(barcodes, func(i, j int) bool {
137+
a, b := barcodes[i], barcodes[j]
138+
if cnt[a] == cnt[b] {
139+
return a < b
140+
}
141+
return cnt[a] > cnt[b]
142+
})
143+
n := len(barcodes)
144+
ans := make([]int, n)
145+
for k, j := 0, 0; k < 2; k++ {
146+
for i := k; i < n; i, j = i+2, j+1 {
147+
ans[i] = barcodes[j]
173148
}
174149
}
175150
return ans
176151
}
177152
178-
type pair struct {
179-
v int
180-
k int
153+
func max(a, b int) int {
154+
if a > b {
155+
return a
156+
}
157+
return b
181158
}
159+
```
182160

183-
type hp []pair
161+
### **TypeScript**
184162

185-
func (h hp) Len() int { return len(h) }
186-
func (h hp) Less(i, j int) bool {
187-
a, b := h[i], h[j]
188-
return a.v > b.v
163+
```ts
164+
function rearrangeBarcodes(barcodes: number[]): number[] {
165+
const mx = Math.max(...barcodes);
166+
const cnt = Array(mx + 1).fill(0);
167+
for (const x of barcodes) {
168+
++cnt[x];
169+
}
170+
barcodes.sort((a, b) => (cnt[a] === cnt[b] ? a - b : cnt[b] - cnt[a]));
171+
const n = barcodes.length;
172+
const ans = Array(n);
173+
for (let k = 0, j = 0; k < 2; ++k) {
174+
for (let i = k; i < n; i += 2, ++j) {
175+
ans[i] = barcodes[j];
176+
}
177+
}
178+
return ans;
189179
}
190-
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
191-
func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) }
192-
func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
193180
```
194181

195182
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /