Leetcode---781.森林中的兔子

今天的每日一题
Leetcode---781.森林中的兔子_第1张图片
Leetcode---781.森林中的兔子_第2张图片

解题思路

使用贪婪算法

  1. 首先获取数组的长度,如果长度为0,直接返回0;
  2. 如果长度不为0,因为数组内元素的顺序对结果没有任何影响,为了便于处理,首先使用Arrays.sort()函数将数组进行排序(升序或降序都可以),并构建栈辅助处理;
  3. 对数组内的元素进行遍历,如果当前的值为0,那么结果直接加一;如果当前值不为0且栈为空,则入栈;
  4. 把栈顶元素与指针指向元素的值进行对比,如果相等,则计数器加一;然后对计数器的值进行判断,如果计数器的值等于栈顶元素的值,那么结果result = result+1+stack.pop();重置计数器为0,这是应对颜色相同的情况;
  5. 当数组内的所有元素遍历完成,对栈内元素依次进行出栈,结果result = result + stack.pop() + 1(要记得+1,因为除了与其颜色相同的数量,还有它自己),直至栈为空;
  6. 最后,返回result即可。

代码

class Solution {
    public int numRabbits(int[] answers) {
        int length = answers.length;
        int result = 0;
        if(length == 0)
            return result;

        int count=0;
        Arrays.sort(answers);
        Stack<Integer> stack = new Stack();
        for(int i=0;i<length;i++)
        {
            if(answers[i] == 0){
                result += 1;
                continue;
            }
            if(stack.empty())
            {
                stack.push(answers[i]);
                continue;
            }
            if(stack.peek() == answers[i])
            {
                count++;
                if(count >= stack.peek())
                {
                    result += 1+stack.pop();
                    count = 0;
                }
            }
            else
            {
                stack.push(answers[i]);
                count=0;
            }
            
        }

        while(!stack.empty())
        {
            result += stack.pop()+ 1;
        }
        return result;
    }
}

你可能感兴趣的:(Java学习,Leetcode每日一题,java,leetcode)