LeetCode每日1题--135. 分发糖果

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/ca…

image.png

解析

这里我们进行比较的时候既要考虑从左往右比较,又要考虑从右往左比较。必须两边都满足情况,如果两边都要满足条件的话,那取值就要从两边的比较结果中取最大值。

什么意思?

我们来看下从左往右的比较代码:

如果右边的大于左边的,那就让糖果数加1,默认值是1

for (int i = 1; i < len; i++) {
    candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
}

我们来看下从右往左的比较代码:

i = len -2 就是让坐标达到最后一个元素的前面,这样进行从右往左的比较

如果在比较过程中,左边的值大于右边的值,那就要进行一次判断,从当前节点糖果值和右边节点糖果值取最大的为当前节点的值。因为在从左往右比较的过程中也对糖果值进行判断了,所以才要取最大值

for (int i = len - 2; i >= 0; i--) {
    if (ratings[i] > ratings[i + 1]) {
        candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
    }
}

最后就是对糖果数组的值进行计算即可

完整代码

class Solution {
    /**
         分两个阶段
         1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
         2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大
    */
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candyVec = new int[len];
        candyVec[0] = 1;
        for (int i = 1; i < len; i++) {
            candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
        }

        for (int i = len - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
            }
        }

        int ans = 0;
        for (int num : candyVec) {
            ans += num;
        }
        return ans;
    }
}