在一个仓库里,有一排条形码,其中第
i
个条形码为barcodes[i]
。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
这是一个经典的贪心算法问题:将数量最多的条形码放在奇数位置,将剩余的条形码放在偶数位置。这样可以保证相邻的条形码不会相同。
以下是C++实现代码:
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
unordered_map<int, int> freq;
int maxFreq = 0, curCode = 0;
for (int code : barcodes) {
freq[code]++;
if (freq[code] > maxFreq) {
maxFreq = freq[code];
curCode = code;
}
}
vector<int> res(barcodes.size());
int idx = 0;
for (int i = 0; i < maxFreq; i++) {
res[idx] = curCode;
idx += 2;
}
freq.erase(curCode);
for (auto& p : freq) {
int code = p.first, freq = p.second;
for (int i = 0; i < freq; i++) {
if (idx >= res.size()) idx = 1;
res[idx] = code;
idx += 2;
}
}
return res;
}
};
在这个实现中,我们首先使用一个哈希表统计每个条形码出现的次数,并找出出现次数最多的条形码 curCode
。然后我们将 curCode
放在奇数位置,之后依次将剩余的条形码放在偶数位置。如果遇到奇数位置超过数组大小的情况,我们需要将指针置为 1,表示从偶数位置重新开始。
需要注意的是,由于题目中并没有规定所有条形码的数量都相等,因此可能存在一些数量比较少的条形码无法完全放置在偶数位置,这时它们就会出现在奇数位置和数组末尾。
int main() {
vector<int> barcodes = { 1,1,1,1,2,2,2,2,3,3 };
Solution so;
vector<int> res = so.rearrangeBarcodes(barcodes);
return 0;
}