1、https://leetcode.cn/problems/gas-station/submissions/514930619/?envType=study-plan-v2&envId=top-interview-150
对于这个问题可以这样来考虑,将数据看作一个环,如果答案唯一,那么就意味着从任意一个节点开始寻找,最后都会得到同一个节点的答案,那么为何不直接从0节点开始呢?
其次,我们可以建立一个total变量来记录总的油量和消耗量的差的结果,倘若这个值小于0,则一定没有解,倘若大于零,则说明一定有解。
继续这个思路,当有解时,我们不妨从i节点出发,设置一个temp变量记录从i开始到j的剩余油量。当temp小于0时,说明现在到达的节点j是可以到达的,但是无法到达j+1节点,那么下次的起点就可以从j+1开始重复这个过程。
为什么?
不妨这样考虑,i到j构成一个弧,同样,我们假设当前的问题是无解的,那么我们应该可以用上述方式将j与j+1断开,把环分成许多的弧。当然我们这里假设的无解,其实从total就可以看出。那么假如现在我们发现total大于0了,我们还可以将环分割成这样的弧吗?我们不妨0开始,一直分割,假设前面我们分割成了许多弧,最后从某个节点k开始一直遍历完了却再也没有分割出弧。那么这个末尾的弧可以和第一个弧链上吗?当然可以!假设不可以的话,那么我们每个弧最终的剩余油量都不足以支持它到达下一个弧,那么total不就是小于0了吗?但我们已经得到了total大于0,所以最后一个弧一定可以和第一个弧连起来,接下来两个弧变成一个弧,我们将这个新弧看作最后一个弧,那么他和现在的新的第一个弧会怎么样呢,同理,他们还是可以连起来的!由此我们的算法就明确了:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int len = gas.size();
vector<int> remaind(len);
int total = 0,temp = 0;
int start = 0;
for(int i=0;i<len;i++){
total=total+gas[i]-cost[i];
temp = temp+gas[i]-cost[i];
if(temp<0){
temp=0;
start=i+1;
}
}
return total<0?-1:start;
}
};
2、https://leetcode.cn/problems/candy/submissions/514952725/?envType=study-plan-v2&envId=top-interview-150
对于这个问题,我们观察数组,会发现第一个和最后一个元素非常特殊,因为它们只有一个元素和自己相邻,如果其余元素都确定了,那么它们也就确定了,所以我们不妨从第二个和倒数第二个元素开始处理,我们设置两个变量j,i它们分别从第二个以及倒数第二个开始向后向前遍历,并且它们会分别比较自己的j-1以及i+1元素,倘若比它们小则不变,大于则比较现在的糖果数量,若是少了则改变糖果数量。最后每个元素都会和自己左右两个相邻的元素比较。
class Solution {
public:
int candy(vector<int>& ratings) {
int len=ratings.size();
vector<int> candy(len);
int total=0;
for(int i=len-2,j=1;i>=0;i--,j++){
if(ratings[i]>ratings[i+1]){
if(candy[i]<=candy[i+1]){
total=total+candy[i+1]+1-candy[i];
candy[i]=candy[i+1]+1;
}
}
if(ratings[j]>ratings[j-1]){
if(candy[j]<=candy[j-1]){
total=total+candy[j-1]+1-candy[j];
candy[j]=candy[j-1]+1;
}
}
}
total = total+len;
return total;
}
};
本文由博客一文多发平台 OpenWrite 发布!
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容