1419 数青蛙
题目理解:青蛙叫,求最少青蛙数,也就是求同时在叫的最大青蛙数量。
一开始题目理解错了,以为就是求青蛙叫的次数。
思路:因为叫出来的字母有顺序,所以我一开始思路是用map预制出每个字符的index,如croak分别是12345.
然后每次叫的时候都校验一下叫的顺序对不对,如叫到2时看一下前面有没有1。然后把叫的index插入到vector
之后再遍历vector,有多少个不是5的index,就是同时在叫的最大青蛙数量。此时时间复杂度大于10的9次方,超时。
优化:设置一个frag计数器,每次插入1的时候,就frag++,每次到5的时候就对frag–。frag++的时候更新result。这样就省去了一重循环。
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
int checkVlue = croakOfFrogs.size() % 5;
if (checkVlue != 0) {
return -1;
}
// 用map来存croak的对应数字
map<char, int> prefabricMap;
prefabricMap['c'] = 1;
prefabricMap['r'] = 2;
prefabricMap['o'] = 3;
prefabricMap['a'] = 4;
prefabricMap['k'] = 5;
// vector 用来存顺序标记
vector<int> vec(6);
// 注意result不一定等于0
int result = 0, frogNum = 0;
for (int i = 0; i < croakOfFrogs.size(); i++) {
// 该方法复杂度高,超过了n9
// int tmp = prefabricMap[croakOfFrogs[i]];
// if(tmp == 1) {
// vec.push_back(1);
// continue;
// }
// // 查找非5的数量
// int count = 0;
// for (int k = 0; k < vec.size(); k++) {
// if(5 != vec[k]) {
// count++;
// }
// }
// result = result > count ? result : count;
// 需要压缩vector避免for循环
// for (int j = 0; j < vec.size(); j++) {
// if (tmp == vec[j] + 1) {
// vec[j]++;
// break;
// }
// }
int tmp = prefabricMap[croakOfFrogs[i]];
if(tmp == 1) {
vec[tmp]++;
frogNum++;
if (frogNum > result) {
result = frogNum;
}
} else {
if (vec[tmp - 1] == 0) {
return -1;
}
vec[tmp - 1]--;
vec[tmp]++;
if(tmp == 5) {
frogNum--;
}
}
}
// int rightNum = croakOfFrogs.size() / 5;
// if (vec.size() != rightNum) {
// return -1;
// }
// for (int i = 0; i < rightNum; i++) {
// if (vec[i] != 5) {
// return -1;
// }
// }
// 要求不同青蛙的最小数目
if(frogNum > 0) {
return -1;
}
return result;
}
};
语法:初始化的时候,即使是int也要赋值为0,不然可能会出现误差