1054.距离相等的条形码

【LetMeFly】1054.距离相等的条形码

力扣题目链接:https://leetcode.cn/problems/distant-barcodes/

在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]

请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。

 

示例 1:

输入:barcodes = [1,1,1,2,2,2]
输出:[2,1,2,1,2,1]

示例 2:

输入:barcodes = [1,1,1,1,2,2,3,3]
输出:[1,3,1,3,2,1,2,1]

 

提示:

  • 1 <= barcodes.length <= 10000
  • 1 <= barcodes[i] <= 10000

方法一:排序(思维 + 构造)

首先使用哈希表ma统计每个数出现的次数。

接着将原始数组barcodes中的元素按照他们在ma中出现的次数从大到小排序,出现次数相同的按照数字大小排序(小到大或大到小都可,这是为了保证相同的数排序后相邻)。

接着开辟一个长度为$len(barcodes)$的答案数组ans,将排好序的barcodes中的元素依次放入ans的偶数下标$0, 2, 4, …$,再依次放入ans的奇数下标$1, 3, 5, …$即可。

题目保证有解,因此不会出现同一个数占据了所有偶数下标后还有剩余的情况

  • 时间复杂度$O(len(barcodes)\times \log len(barcodes))$
  • 空间复杂度$O(len(barcodes))$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
unordered_map<int, int> ma;
for (int t : barcodes) {
ma[t]++;
}
sort(barcodes.begin(), barcodes.end(), [&](int a, int b) {
return ma[a] != ma[b] ? ma[a] > ma[b] : a > b;
});
vector<int> ans(barcodes.size());
for (int j = 0, k = 0; k < 2; k++) {
for (int i = k; i < barcodes.size(); i += 2) {
ans[i] = barcodes[j++];
}
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
# from typing import List
# from collections import defaultdict

class Solution:
def rearrangeBarcodes(self, barcodes: List[int]) -> List[int]:
ma = defaultdict(int)
for t in barcodes:
ma[t] += 1
barcodes.sort(key=lambda x: (-ma[x], x))
ans = [0] * len(barcodes)
ans[::2] = barcodes[:(len(barcodes) + 1) // 2]
ans[1::2] = barcodes[(len(barcodes) + 1) // 2:]
return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130665688


1054.距离相等的条形码
https://blog.letmefly.xyz/2023/05/14/LeetCode 1054.距离相等的条形码/
作者
Tisfy
发布于
2023年5月14日
许可协议