題意:給你一個(gè)數(shù)組vector驮审,給你一個(gè)數(shù)W,問能否將vector數(shù)組均分,對(duì)每份來說數(shù)量都是W疯淫,而且每份都是連續(xù)的數(shù)字地来。
解題思路:先對(duì)vector做個(gè)排序,然后使用一個(gè)map(其實(shí)可以使用set的)存儲(chǔ)下標(biāo)數(shù)熙掺,遍歷map通過iter->first獲得vector的下標(biāo)未斑,然后判斷取出的一列數(shù)否能排成連續(xù)的一個(gè)W序列,最后判斷總序列數(shù)是否等于vector.size() / W适掰。
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
if(hand.size() % W) return false;
sort(hand.begin(), hand.end());
map<int, int> imap;
for(int i = 0; i < hand.size(); i++)
imap[i] = 0;
int times = hand.size() / W;
int len = 0, n = 0, cnt = 0;
for(map<int,int>::iterator iter = imap.begin();
iter != imap.end(); ){
cout << iter->first << " " << hand[iter->first] << endl;
if(len == 0){
n = hand[iter->first];
len++;
}else if(hand[iter->first] - n == 1){
n = hand[iter->first];
len++;
}else if(hand[iter->first] - n == 0){
iter++;
continue;
}else{
return false;
}
map<int,int>::iterator tmp = iter;
iter++;
imap.erase(tmp);
if(len == W){
cnt++;
len = 0;
iter = imap.begin();
continue;
}
}
return cnt == times;
}
};
需要注意的地方:
map 一邊遍歷一邊刪除颂碧。
map<int, int> imap;
imap[0] = 0;
imap[1] = 1;
imap[2] = 2;
for(map<int, int>::iterator iter = imap.begin(); iter != imap.end(); ){
if(iter->second == 1){
map<int, int>::iterator tmp = iter;
iter++; //iter指向下一個(gè)元素。
imap.erase(tmp); //把該元素從imap中刪除
continue类浪; //跳過循環(huán)體內(nèi)的內(nèi)容
}
iter++ //如果把iter放在for循環(huán)的第三部分载城,continue之后還會(huì)執(zhí)行,會(huì)造成iter++重復(fù)费就。
}