分发糖果,力扣

135. 分发糖果 - 力扣(LeetCode)

今天刷分发糖果,属于困难程度,大家有兴趣可以点上看看题目要求,试着做一下

审题目+事例+提示:

”相邻的学生中,评分高的学生必须获得更多的糖果“

即所有学生需满足左规则与右规则(比较左右两边)

方法有两个:

第一、常量空间遍历,这个方法只需遍历一次,应该有不少同学往这个思路想,但是这个方法同时需要考虑左右两边情况,情况比较复杂和多,容易出现顾此失彼。

第二、贪心算法,这个方法的重要思想是贪心思想,它是先确定一边情况,再去确定另一边,不需要考虑太多情况。

我们直接看题解吧:

贪心算法(Java)思路:

定义left与right两个数组,

第一个循环:

左规则(从左往右):

先给所有学生给一个糖果,

·若ratings[i]>ratings[i-1],i就比i-1多一个糖果;

·若ratings[i]<=ratings[i-1],则无变化,遍历下一位。

第二个循环:

右规则(从右往左):

先给所有学生给一个糖果,

这时候需要一个数记录,从left[ratings.length-1]处开始

·若ratings[i]>ratings[i+1],i就比i-1多一个糖果;

·若ratings[i]<=ratings[i+1],则无变化,遍历下一位。

对左右规则下取得的数进行比较,取最大值,便可以满足左右规则。

代码:

class Solution {
    public int candy(int[] ratings) {
        int[] left = new int[ratings.length];
        int[] right = new int[ratings.length];
        Arrays.fill(left, 1);
        Arrays.fill(right, 1);
        for(int i = 1; i < ratings.length; i++)
            if(ratings[i] > ratings[i - 1]) left[i] = left[i - 1] + 1;
        int count = left[ratings.length - 1];
        for(int i = ratings.length - 2; i >= 0; i--) {
            if(ratings[i] > ratings[i + 1]) right[i] = right[i + 1] + 1;
            count += Math.max(left[i], right[i]);
        }
        return count;
    }
}

注意使用Arrays 类fill() 方法math类的max()方法。


好难,是我自不量力了哈哈哈,才刷几道题就去挑战困难等级的题目。

你可能感兴趣的:(#,数组,leetcode,算法,职场和发展)