首页 > 其他分享 >leetcode 135.分发糖果

leetcode 135.分发糖果

时间:2024-07-08 19:57:20浏览次数:16  
标签:分发 ratings 递增 result 135 序列 递减 糖果 leetcode

题目:
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。

题目示例:

示例 1:
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
     第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

解题方法1:

双向遍历

代码:

class Solution:
    def candy(self, ratings: List[int]) -> int:
        num=[0]*len(ratings) #用来保存遍历每个位置的糖果数目
        num[0]=1 #正向第一位为1
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]: #大于则前置加1赋予
                num[i]=num[i-1]+1 
            else:
                num[i]=1 #否则置1
        result=0 #最终分发糖果数目
        result=result+max(1,num[len(ratings)-1]) #先将反向第一位置于结果
        right=1 #反向第一位为1
        for i in range(len(ratings)-2,-1,-1):
            if ratings[i]>ratings[i+1]: #反向赋予大于前置加1
                right+=1
            else:
                right=1 #否则置0
            result=result+max(right,num[i]) #正向反向对比,赋予结果里
        return result

代码思路:

这道题的思路就是要保证得分大的要比得分小的得到的糖果多。

先不考虑边界,一个数目有两边大小比较,单次遍历只能看一边。

所以正向遍历,反向遍历两次

第一次正向遍历满足糖果多的比左边大,第二次反向遍历满足糖果多的比右边大

因为要保证左右均满足,所有取正向反向糖果数目最大,相加即最终结果

代码逻辑:

num保存正向遍历结果,right变量保存反向结果,不用数组节省空间

正向遍历如果右边数组比左边大,即前置数目+1,否则置1

反向同,如果左边数组比右边大,则前置数目+1,否则置1

两个对比取最大,最大数即当前位置分发糖果数,将最大数累加到结果里

空间复杂度为O(n),时间复杂度O(n)

解题方法2:

找递增递减规律

代码:

class Solution:
    def candy(self, ratings: List[int]) -> int:
        dizeng=1 #递增长度
        dijian=0 #递减长度
        idx=1 #idx记录当前递增糖果数
        result=1 #返回结果数
        for i in range(1,len(ratings)):
            if ratings[i]>ratings[i-1]: #大于递增序列
                dijian=0 #递减置0
                idx+=1 #递增+1
                dizeng=idx #递增长度赋予
                result+=idx #结果返回
            elif ratings[i]==ratings[i-1]: #等于赋1序列,递增为1
                dijian=0 
                dizeng=1
                idx=1
                result+=1 
            else: #递减序列统计
                dijian+=1 #递减长度+1
                if dijian==dizeng: 
                    dijian+=1 #说明前递增序列最后一位要加入递减序列
                result+=dijian #可以看为在递减序列最顶部插入
                idx=1 
        return result

代码思路:

可以将得分看作递增序列与递减序列,

时刻记录递增序列长度与递减序列长度

难点在于当递减序列长度与递增长度相同时,递增序列的最后一位也要加入递减序列

代码逻辑:

分为三块,递增统计,不变统计与递减统计

空间复杂度为O(1),时间复杂度O(n)

标签:分发,ratings,递增,result,135,序列,递减,糖果,leetcode
From: https://blog.csdn.net/qq_60461973/article/details/140276801

相关文章

  • 代码随想录算法训练营第五天|LeetCode242.有效的字母异位词 LeetCode 349. 两个数组的
    代码随想录算法训练营Day5代码随想录|LeetCode242.有效的字母异位词LeetCode349.两个数组的交集LeetCode202.快乐数LeetCode1.两数之和文章目录代码随想录算法训练营前言代码随想录原文--哈希表今天的内容真的很有挑战o(╥﹏╥)o,做了很久一、哈希表基础理论1......
  • 代码随想录算法训联营第四天|LeetCode24. 两两交换链表中的节点 LeetCode19.删除链表
    系列文章目录代码随想录算法训练营第四天:代码随想录|LeetCode24.两两交换链表中的节点LeetCode19.删除链表的倒数第N个节点面试题02.07.链表相交LeetC142.环形链表文章目录系列文章目录前言一、LeetCode24.两两交换链表中的节点1、题目链接2、题解二、LeetCod......
  • LeetCode 523. 连续的子数组和
    523.连续的子数组和给你一个整数数组 nums 和一个整数 k ,如果 nums 有一个 好的子数组 返回 true ,否则返回 false:一个 好的子数组 是:长度 至少为2 ,且子数组元素总和为 k 的倍数。注意:子数组 是数组中 连续 的部分。如果存在一个整数 n ,令整数 x......
  • LeetCode 974. 和可被 K 整除的子数组
    974.和可被K整除的子数组给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的非空 子数组 的数目。子数组 是数组中 连续 的部分。示例1:输入:nums=[4,5,0,-2,-3,1],k=5输出:7解释:有7个子数组满足其元素之和可被k=5整除:[4,5,0......
  • [LeetCode] 134. Gas Station
    想到了提前判断和小于0的情况,懒得写,果然被阴间用例10万个加油站坑了。classSolution:defcanCompleteCircuit(self,gas:List[int],cost:List[int])->int:#1n=len(gas)ifn==1:ifgas[0]>=cost[0]:ret......
  • LeetCode 算法:岛屿数量 c++
    原题链接......
  • [LeetCode] 238. Product of Array Except Self
    坑真的很多,首先要处理全零reduce没有值typeerror的问题。classSolution:defproductExceptSelf(self,nums:List[int])->List[int]:total=reduce(mul,nums)ret=[]iftotal==0:try:total=reduce(mul,[......
  • 刷爆leetcode第九期
    题目一单值二叉树如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回false。题目图片如下我们这里主要是判断下根的值和它的左孩子还有右孩子相不相等如果相等返回true如果不相等返回false(当然这里还需要......
  • 刷爆leetcode第十期
    题目一相同的树给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。首先我们要来判断下它们的根是否相等根相等的话是否它们的左子树相等是否它们的右子树相等一直到子树为空为止大......
  • Leetcode刷题记录1 哈希+双指针+滑动窗口
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言hot1001.哈希#1.两数之和#49.字母异位词分组#128.最长连续序列2.双指针#283.移动零#11.盛最多水的容器#15.三数之和#42.接雨水3.滑动窗口#3.无重复字符的最长子串#438.找到字符串中所有......