本人菜鸡一个,欢迎评论私信交流
个人主页
森林中的兔子
https://leetcode-cn.com/problems/rabbits-in-forest/
解法【1】
- 首先对数组排序
- 设置变量
repNum依次标记重复的数字的值,
lenrepNum依次标记重复的数字在当前位置应存在的最大值
res记录结果 - 遍历数组:
首位置、当前位置为0,res直接+1。
首位置不为0,赋值给repNum表示当前重复的值,repNum+1赋值给lenrepNum代表与该位置相同的值最多个数。
当前位置值和repNum同,lenrepNum值减一;若是当前位置也是最后的位置,res += 当前值+1。否则,当lenrepNum减到0,表示对当前重复值全部出现完毕,res += 当前重复值+1,这时应更新repNum和lenrepNum。
如果当前位置值和当前重复值不同,表示当前重复值并未完全出现,所以该重复值出现次数最小值仍是该重复值+1,故更新res += repNum+1;并更新repNum和lenrepNum(这块跟上边可以合并说的。。。),这里要注意repNum已经在新位置上了。另外如果当前位置值和当前重复值不同并且当前位置是i-1的话,更新res需要包含当前位置值和当前重复值,即repNum + 1 + answers[i] + 1
class Solution {
public int numRabbits(int[] answers) {
Arrays.sort(answers);
// for(int i=0;i<answers.length;i++){
// System.out.println(answers[i]);
// }
int repNum = 0;
int lenrepNum = 0;
int res = 0;
for(int i = 0,l = answers.length;i < l;i++){
if(answers[i] == 0){
res++;
}
else{
if(i == 0 || answers[i-1] == 0){
repNum = answers[i];
lenrepNum = repNum + 1;
}
if(answers[i] == repNum){
lenrepNum--;
if(i+1 == answers.length){
res += (repNum + 1);
break;
}
if(lenrepNum == 0){
res += (repNum + 1);
if(i+1<answers.length){
repNum = answers[i+1];
lenrepNum = repNum + 1;
}
}
}else{
if(i + 1 == answers.length){
res += repNum + 1 + answers[i] + 1;
break;
}else{
res += (repNum + 1);
repNum = answers[i];
lenrepNum = repNum;
}
}
}
// System.out.printf(res+" "+repNum+" "+lenrepNum+"\n");
}
return res;
}
}