【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中出现的次数从大到小排序,出现次数相同的按照数字大小排序(小到大或大到小都可,这是为了保证相同的数排序后相邻)。
接着开辟一个长度为 l e n ( b a r c o d e s ) len(barcodes) len(barcodes)的答案数组ans,将排好序的barcodes中的元素依次放入ans的偶数下标 0 , 2 , 4 , . . . 0, 2, 4, ... 0,2,4,...,再依次放入ans的奇数下标 1 , 3 , 5 , . . . 1, 3, 5, ... 1,3,5,...即可。
题目保证有解,因此不会出现同一个数占据了所有偶数下标后还有剩余的情况
- 时间复杂度 O ( l e n ( b a r c o d e s ) × log l e n ( b a r c o d e s ) ) O(len(barcodes)\times \log len(barcodes)) O(len(barcodes)×loglen(barcodes))
- 空间复杂度 O ( l e n ( b a r c o d e s ) ) O(len(barcodes)) O(len(barcodes))
AC代码
C++
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
# 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