生活随笔
收集整理的這篇文章主要介紹了
1054. 距离相等的条形码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在一個倉庫里,有一排條形碼,其中第 i 個條形碼為 barcodes[i]。
請你重新排列這些條形碼,使其中兩個相鄰的條形碼 不能 相等。 你可以返回任何滿足該要求的答案,此題保證存在答案。
示例 1:
輸入:[1,1,1,2,2,2]
輸出:[2,1,2,1,2,1]
示例 2:
輸入:[1,1,1,1,2,2,3,3]
輸出:[1,3,1,3,2,1,2,1]
提示:
1 <= barcodes.length <= 10000
1 <= barcodes[i] <= 10000
這個題寫的比較麻煩,應該是我想復雜了。一開始用的優先隊列,但是有的樣例不對,所以我先用的優先隊列,之后再判斷的,應該有更簡單的方法。。
class Solution {
public:vector
<int> rearrangeBarcodes(vector
<int>& barcodes
) {int maxx
=1e4+100;int a
[maxx
];memset(a
,0,sizeof(a
));struct node
{int num
;int cnt
;int flag
;node(int x
,int y
,int z
){num
=x
,cnt
=y
,flag
=z
;}bool operator <(const node
&a
)const{if(cnt
!=a
.cnt
) return cnt
<a
.cnt
;else return num
>a
.num
;}};for(int i
=0;i
<barcodes
.size();i
++) a
[barcodes
[i
]]++;priority_queue
<node
> p
;for(int i
=1;i
<=10000;i
++){if(a
[i
]) p
.push(node(i
,a
[i
],0));}vector
<int> q
,qq
,pos
;while(p
.size()){node a
=p
.top();p
.pop();q
.push_back(a
.num
);a
.cnt
--;a
.flag
++;if(a
.cnt
) p
.push(a
);}for(int i
=0;i
<q
.size()-1;i
++){if(q
[i
]==q
[i
+1]){qq
.push_back(q
[i
]);pos
.push_back(i
);}}if(qq
.size()==0) return q
;else {for(int i
=0;i
<pos
.size();i
++) q
.erase(q
.begin()+pos
[i
]-i
);q
.insert(q
.begin(),0);q
.insert(q
.end(),0);int i
=0;while(qq
.size()>0){int x
=qq
[0];for(;i
<q
.size()-1;i
++){if(x
!=q
[i
]&&x
!=q
[i
+1]){q
.insert(q
.begin()+i
+1,x
);qq
.erase(qq
.begin());break;}}if(i
==q
.size()-1) i
=0;}q
.erase(q
.begin());q
.erase(q
.end()-1);return q
;}}
};
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的1054. 距离相等的条形码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。