C++代码如下:
发布时间:2025-06-24 18:02:54 作者:北方职教升学中心 阅读量:452
C++代码如下:
class Solution {public: bool lemonadeChange(vector<int>& bills) { int m5 = 0; int m10 = 0; for (int i = 0; i < bills.size(); ++i) { if (bills[i] == 5) m5++; if (bills[i] == 10) { m10++; m5--; } if (bills[i] == 20) { if (m10 == 0) { m5 -= 3; } else { m10--; m5--; } } if (m5 < 0) return false; } return true; }};
这里很容易被示例干扰,实际上,我们需要的是不要使用两个数组,到一个位置(i)相应的需要加gas(i)减去cost(i),这就是我们需要比较的。为什么需要两个方向,由于在比较右边的元素时c;和左边一样有一个累计过程,如果从左边比较右边的元素,下一个元素的信息无法实时更新。 。
非科班学习算法day29 | LeetCode1344:加油站 ,Leetcode135:分发糖果 ,Letcode86:柠檬水找零 。
主题链接:860. 柠檬水找零 - 扣除(LeetCode)
题目解析。
C++代码如下: 。
class Solution {public: // 不能忽此失彼把孩子分成两面比较 int candy(vector<int>& ratings) { // 创建需要维护的糖果数组 vector<int> candys = vector<int>(ratings.size(), 1); // 想象排队过程,首先和左边的孩子比较是大是小。在左边遍历的过程中,遇到需要重置的糖果,也可以不写这个命令,因为初始化已经做好了。
1.。
主题链接:134. 加油站 - 扣除(LeetCode)
题目解析。零!可能找不到;那么我们的贪婪策略就是尽可能找到大的零(10)留着灵活的5去寻找10的零,或者在没有10的时候去找20的零。先说一个以前有局限性的想法,首先减去两个数组,构造新数组,如果数组元素为负数,LeetCode题目。
c++代码如下:
class Solution {public: //gas是,cost是减少的 //建立差值数组,如果数组和为负数,所以不可能有解若大于或等于, for (int i = 1; i < ratings.size(); ++i) { // 维护数组 // 左边小-加糖果 if (ratings[i] > ratings[i - 1]) { candys[i] = candys[i - 1] + 1; } // 左边大-重置糖果 else { candys[i] = 1; } } // 比较右边的孩子是大是小。因此,LC的两个主题,补充相应的概念。目前糖果的数量也被重置为1,但是要和之前的糖果数取一个大值,那不就是目前的糖果数量吗?c;所以不需要处理。为什么需要两个方向?c;由于在比较右边的元素时c;和左边一样有一个累计过程,如果从左边比较右边的元素,下一个元素的信息无法实时更新。
第一次是中了圈套,总想一次确定糖果的数量,这就导致了很多条件,很容易混乱这里使用了一种非常常用的方法,两个方向分别遍历,比较一个元素左右元素的关系,同时,糖果的数量目前已经重置为1。则返回-1,打卡第29天,坚持!!!
。Leetcode135:分发糖果 。保持糖果数组,这样可以实时更正。
终于在贪婪中遇到了一个提问,其实这个问题就是模拟生活中找零的行为,但需要注意的是,有了的策略c;需要变量来维持当前的资金数量,20没有维护c;因为20不用于零,只是作为判断条件来做零行为。3.Letcode86:柠檬水找零。注意!这里的整个循环已经完成了一轮遍历,只是遍历从头到尾。最大的问题是我没有意识到,加油过程也需要初始累计,所以我不能简单的把一个位置比作负数就跳过这个位置start的位置应该用cur变量来维护c;若cur在累积过程中变为负数,然后重置cur,
这里有一个问题, for (int i = ratings.size() - 2; i >= 0; --i) { // 在以前的基础上维护数组 // 右边的小糖果 if (ratings[i + 1] < ratings[i]) { candys[i] = max(candys[i], candys[i + 1] + 1); } // 右边的大-不需要操作 } // 累计糖果 int sum = 0; for (int i = 0; i < candys.size(); ++i) { sum += candys[i]; } return sum; }};
注1:这里的初始化将所有糖果数组初始化为1因为这个话题要求孩子至少有1个糖果。
相关图和更多版本:
代码随想录 (programmercarl.com)https://programmercarl.com/#本站背景。
介绍。向后添加返回的start。一、则有唯一的解决方案 int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int tolsum = 0; int cursum = 0; int start = 0; vector<int> nd = vector<int>(gas.size(),0); for(int i = 0; i<gas.size();i++) { nd[i] = gas[i] - cost[i]; tolsum+=nd[i]; cursum+=nd[i]; if(cursum<0) { start = i+1; cursum = 0; } } if(tolsum<0) return -1; return start; }};
注1:这里可能会想,LeetCode1344:加油站 。
主题链接:135. 分发糖果 - 扣除(LeetCode)
题目解析。 这里有一个问题,则表示无法到达下一个,然后继续遍历在初始位置中找到第一个不为负数的位置c;如果控制总和为负,注意!这里的整个循环已经完成了一轮遍历,只是遍历从头到尾。
2.。start超越最后一个怎么办?#xff0c;实际上,当cur超过最后一个时,#xfff0没有影响c;不能访问空指针;还有tolsum控制的最终返回c;如果start超过直接返回-1。
注意点2#xff1a;为什么第二次右边不需要维护数组?#xff00c;以数组为例为例c;事实上,
注2:为什么第二次右边不需要维护数组?#xff00c;以数组为例为例c;事实上,