欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > LeetCode面试题Day7|LeetCode135 分发糖果、LeetCode42 接雨水

LeetCode面试题Day7|LeetCode135 分发糖果、LeetCode42 接雨水

2025/5/24 9:44:29 来源:https://blog.csdn.net/m0_74174715/article/details/141105545  浏览:    关键词:LeetCode面试题Day7|LeetCode135 分发糖果、LeetCode42 接雨水

题目1:

指路:

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

思路与分析:

给n个孩子按照评分给糖果,要求有二,其一为每个孩子最少有一颗糖果;其二为相邻孩子评分更高的糖果越多。那么在这里第一个条件没有异议,直接初始化一个结果数组初始化为n个1即可。那么接下来就是对比相邻孩子之间的评分并设置糖果值。在这里有一个需要思考的地方,拿给出的exampl1来讲,[1, 0, 2],对于左边两个孩子的评分来说,左1孩子评分比中间的孩子高,得到的糖果数也应该比中间的孩子多,而对于右边的两个孩子说,右边的孩子评分比中间的孩子高,得到的糖果数也应该比中间的孩子多。那么按照初始化为1的糖果数来看,最初三者糖果数皆为1,而左边孩子的糖果为2,右边孩子多一个也应该是2。那么总数就是5。那么再多几个孩子,例如[1, 2, 4, 3, 6, 5],首先,初始化的糖果集无异,[1, 1, 1, 1, 1, 1],那么因为(从左往右)第二个孩子的评分高于第一个,而第三个孩子的评分多于第二个,所以前三个孩子的糖果数应该是:第三个>第二个>第一个。而从第四个开始,因为其评分低于第三个,所以第四个孩子的糖果数理应少于第三个。那么这里就引发了左右不统一。接下来尝试解决左右不统一的问题。我们可以将评分分为两部分,左边>右边和右边大于左边,从前往后遍历时,当后者评分大于前者评分时,后者的糖果数也应该比前者的糖果数多一个(求的是最少的糖果数)。同样,从后往前当前者的评分大于后者评分时,这个孩子的糖果数为右边孩子的糖果数+1。当其顺序遍历得到的糖果数大于倒序遍历得到的糖果数时保留原糖果数。最后得到糖果集的总和即为最少需要准备的糖果数。

代码:

class Solution {
public:int candy(vector<int>& ratings) {int n = ratings.size();int ans = 0;vector<int> candies(n, 1);  // 最终糖果集for (int i = 1; i < n; i++) {if (ratings[i] > ratings[i - 1]) {  candies[i] = candies[i - 1] + 1;}}for (int i = n - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candies[i] = max(candies[i], candies[i + 1] + 1);}}for (int i = 0; i < n; i++) {ans += candies[i];}return ans;}
};

题目2:

指路:

. - 力扣(LeetCode)42 接雨水

思路与分析:

经典接雨水,那么我们讲接雨水的条件是两边的板高度大于中间,且短板效应接到的雨水高度以较低的板为主。那么首先要找出左边界的最大值和右边界的最大值。最后因为其宽度都为1,最正确的应该是长度乘宽度。

代码:

class Solution {
public:int trap(vector<int>& height) {int hsum = 0;int n = height.size();if (n == 0) return 0;vector<int> leftMax(n, 0);leftMax[0] = height[0];for (int i = 1; i < n; i++) {leftMax[i] = max(leftMax[i - 1], height[i]);}vector<int> rightMax(n, 0);rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; i--) {rightMax[i] = max(rightMax[i + 1], height[i]);}for (int i = 0; i < n; i++) {hsum += min(leftMax[i], rightMax[i]) - height[i];}return hsum;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词