首页 > 其他分享 >LeetCode刷题记录——day3

LeetCode刷题记录——day3

时间:2024-03-21 20:33:55浏览次数:23  
标签:int day3 candy LeetCode vector len total 节点 刷题

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 发布!

标签:int,day3,candy,LeetCode,vector,len,total,节点,刷题
From: https://www.cnblogs.com/humanplug/p/18088194

相关文章

  • 记忆化搜索 —— Leetcode 2684. 矩阵中移动的最大次数
    题目如下:给你一个下标从 0 开始、大小为 mxn 的矩阵 grid ,矩阵由若干 正 整数组成。你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历 grid :从单元格 (row,col) 可以移动到 (row-1,col+1)、(row,col+1) 和 (row+1,col+1) 三个单元......
  • [Kyana]力扣刷题经验一
    滑动窗口11:盛水最多的容器关键:需要找到长的板和长的距离解法一:暴力法,类似冒泡的双重循环,优化后时间复杂度为O(√n),不符合要求。解法二:双指针,从头尾往中间凑,不断更新长板和面积,时间复杂度为O(㏒n),Python3代码如下。classSolution:defsolveProblem(self,height:list)-......
  • LeetCode-滑动窗口最大值
    """题目来源https://leetcode.cn/problems/sliding-window-maximum/"""fromcollectionsimportdequeclassSolution(object):defmaxSlidingWindow(self,nums,k):#记录所有区间长度为k的最大值ans=[]#单调递减队列,从队首......
  • 代码随想录算法训练营day29 | leetcode 491. 非递减子序列、46. 全排列、47. 全排列 I
    目录题目链接:491.非递减子序列-中等题目链接:46.全排列-中等题目链接:47.全排列II-中等题目链接:491.非递减子序列-中等题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重......
  • LeetCode 2265. Count Nodes Equal to Average of Subtree
    原题链接在这里:https://leetcode.com/problems/count-nodes-equal-to-average-of-subtree/description/题目:Giventhe root ofabinarytree,return thenumberofnodeswherethevalueofthenodeisequaltothe average ofthevaluesinits subtree.Note:Th......
  • 2024-03-20 leetcode写题记录
    目录2024-03-20leetcode写题记录23.合并K个升序链表题目链接题意解法4.寻找两个正序数组的中位数题目链接题意解法25.K个一组翻转链表题目链接题意解法2024-03-20leetcode写题记录23.合并K个升序链表题目链接23.合并K个升序链表题意给你一个链表数组,每个链表......
  • 每日刷题 最长递增
    一·题目https://www.lanqiao.cn/problems/158/learning/?page=1&first_category_id=1&difficulty=30&second_category_id=3二.题目要求1.输入要求输入的第一行包含一个整数n第二行包含n个整数a1,a2,…,an,相邻的整数间用空格分隔,表示给定的数列。其中2≤n≤1000,0≤数列中的书≤......
  • 2024-03-19 leetcode写题记录
    目录2024-03-19leetcode写题记录85.最大矩形题目链接题意解法2024-03-19leetcode写题记录85.最大矩形题目链接85.最大矩形题意给定一个仅包含0和1、大小为rowsxcols的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。解法先对每个元素求出其往上能延伸......
  • LeetCode刷题记录——day2
    https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150问题在于不使用除法并且空间复杂度为O(1),当第一次从头开始遍历时由于不知道后续数组元素是什么,所以无法得到答案,而如果当知道一个后续数组元素后,又回去更......
  • leetcode代码记录(长度最小的子数组
    目录1.题目:2.我的代码:小结:1.题目:给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl,numsl+1,…,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输......