本文主要是介绍代码随想录刷题笔记-Day34,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 加油站
134. 加油站https://leetcode.cn/problems/gas-station/
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
示例 1:
输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。
示例 2:
输入: gas = [2,3,4], cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。
解题思路
要保证能够行驶一圈,首先cos的总和一定是要小于gas的总和的。而且,解是唯一的。而且行驶方向一定是正向的,不能逆向。从0开始出发,一路上如果的油量如果小于0了,那就说明从0出发需要初始就有那么多油,那就是说从初始点出发重新到0的时候至少有那么多油,所以起始可以从末尾往前找第一个满足这个油量积累的点就是出发点。
代码
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int sum = 0;int min = 0;// 从0开始的差的最多的油,也就是说如果整体是满足的话,那么后面几个的剩余是可以补上min的,也就是说,我从后往前找到min的位置就可以了for (int i = 0; i < cost.length; i++) {sum += gas[i] - cost[i];min = Math.min(min, sum);}if (sum < 0)return -1;if (min >= 0)return 0;sum = 0;int i = cost.length - 1;for (; i > 0; i--) {sum += gas[i] - cost[i];if (sum + min >= 0)break;}return i;}
}
2. 分发糖果
135. 分发糖果https://leetcode.cn/problems/candy/
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2]
输出:5
解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
示例 2:
输入:ratings = [1,2,2]
输出:4
解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。
解题思路
每个孩子都至少得到1个糖果,相邻的两个孩子如果出现了评分不一致的情况,那么评分高的需要更多的糖果。每个都设置为1,当发现有更大的就++,当相等或者下降的时候,如果不是1,那么新的设为1,如果是1,逆序回去进行加,也就是逆序回去发现有更大的,就++。
开始考虑这个解决办法的优化,也许会存在一个12345554321,这种的话,最后一个54321会从21,321,4321,54321重复操作很多次。所以能不能不要重复执行。
正序能够解决的是非递减的情况,逆序能够解决的是非递增的情况。最后的情况一定是同时满足于左右序的,所以最后得到一个max的累加。
代码
class Solution {public int candy(int[] ratings) {int left[] = new int[ratings.length];left[0] = 1;for (int i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1])left[i] = left[i - 1] + 1;elseleft[i] = 1;}int res = Math.max(left[ratings.length - 1], 1);int right = 1;for (int i = ratings.length - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1])right++;elseright = 1;res += Math.max(right, left[i]);}return res;}
}
这篇关于代码随想录刷题笔记-Day34的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!