#781 森林中的兔子 【力扣刷题笔记,无限更新】

本人菜鸡一个,欢迎评论私信交流
个人主页

森林中的兔子

https://leetcode-cn.com/problems/rabbits-in-forest/

解法【1】

  1. 首先对数组排序
  2. 设置变量
    repNum依次标记重复的数字的值,
    lenrepNum依次标记重复的数字在当前位置应存在的最大值
    res记录结果
  3. 遍历数组:
    首位置、当前位置为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;
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值