在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。
请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
目录
adjacent_find(iterator beg,iterator end)
random_shuffle(itrerator beg,iterator end)
1.STL
STL在algorithm的头文件中有两个算法,adjacent_find和random_shuffle,然后,毫不意外的超时了。不过还是介绍一下两种算法。
adjacent_find(iterator beg,iterator end)
功能:查找相邻重复元素,返回相邻重复元素中第一个元素的迭代器,没有查找到则返回end();
random_shuffle(itrerator beg,iterator end)
功能:对指定范围内的元素随机排序(如果想要每次生成的随机结果不一样,就需要添加随机数种子,scrand((unsigned)time(NULL)),以及头文ctime;
class Solution {
public:
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
while(adjacent_find(barcodes.begin(),barcodes.end())!=barcodes.end())
{
random_shuffle(barcodes.begin(),barcodes.end());
}
return barcodes;
}
};
2.正反遍历
思路参考:Leetcode作者mantoufan
链接:https://leetcode.cn/problems/distant-barcodes/solution/shuang-zhi-zhen-liang-ci-bian-li-jian-lo-n3yq/
从左到右遍历,若两个相邻的数相等,则往后找一个与这两数不同的然后交换。从右到左同理。
注意:
1.由于是邻近,注意数组下标不能越界。
2.要两个相邻数相等,与后面交换的应该是第二个相等数,以此达到两次遍历的差异。
class Solution {
public:
vector<int> rearrangeBarcodes(vector<int>& barcodes) {
for (int i = 0; i < (int)barcodes.size()-1; i++) {
if (barcodes[i] == barcodes[i + 1]) {
for (int j = i + 2; j < (int)barcodes.size(); j++) {
if (barcodes[i+1] != barcodes[j]) {
swap(barcodes[i+1], barcodes[j]);
break;
}
}
}
}
for (int i = barcodes.size() - 1; i >= 1; i--) {
if (barcodes[i] == barcodes[i - 1]) {
for (int j = i - 2; j >= 0; j--) {
if (barcodes[i-1] != barcodes[j]) {
swap(barcodes[i-1], barcodes[j]);
break;
}
}
}
}
return barcodes;
}
};