134. 加油站
使用三个变量total
、cur
和start
来记录总剩余油量、当前剩余油量和起始加油站的索引。在遍历加油站数组的过程中,不断更新cur
为当前剩余油量,并根据cur
的值判断是否需要更换起始加油站。
如果cur
小于0,说明从当前起点到当前加油站无法行驶,需要将起始加油站更新为下一个加油站(即start = i + 1
),并重置cur
为0。同时,累加总剩余油量total
。
class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int total = 0, cur = 0, start = 0;for (int i = 0; i < gas.length; i++) {cur += gas[i] - cost[i];if (cur < 0) {start = i + 1;cur = 0;}total += gas[i] - cost[i];}return total >= 0 ? start : -1;}
}
135. 分发糖果
经典难题,需要使用两个数组lefts
和rights
来分别记录每个学生左边和右边的糖果数量,然后计算总共需要的糖果数量res。
从左向右遍历所有学生,对于每个学生,如果其评分比左边的学生高,那么他应该比左边的学生获得更多糖果,因此糖果数量为左边学生的糖果数量加一;否则,糖果数量为1。将每个学生的糖果数量记录在lefts
数组中。右边同理。
class Solution {public int candy(int[] ratings) {int[]lefts=new int[ratings.length];int[]rights=new int[ratings.length];int res=0;for (int i = 0; i < rights.length; i++) {if(i>0 && ratings[i-1]<ratings[i]){lefts[i]=lefts[i-1]+1;}else{lefts[i]=1;}}for (int i = rights.length-1; i >= 0; i--) {if(i<rights.length-1 && ratings[i]>ratings[i+1]){rights[i]=rights[i+1]+1;}else{rights[i]=1;}res+=lefts[i]>rights[i]?lefts[i]:rights[i];}return res;}
}
860.柠檬水找零
???怎么又插了道简单题,像大一的机试,按照常识优先找回10块的
class Solution {public boolean lemonadeChange(int[] bills) {int five = 0, ten = 0;for (int i = 0; i < bills.length; i++) {if (bills[i] == 5) five++;else if (bills[i] == 10) {five--;ten++;}else if (bills[i] == 20) {if (ten > 0) {five--;ten--;}else {five -= 3;}}if (five < 0 || ten < 0) return false;}return true;}
}
406.根据身高重建队列
题目不好看懂,对于每个元素 nums
,它是一个一维数组,其中 nums[0]
表示身高,nums[1]
表示前面身高大于等于当前身高的人数。然后,通过 queue.add(nums[1], nums)
将该元素插入到队列 queue
的指定位置上,按照 nums[1]
的值插入。
class Solution {public int[][] reconstructQueue(int[][] people) {Arrays.sort(people,(a,b)->{if(a[0] == b[0]) return a[1]-b[1];else return b[0]-a[0];});List<int[]> queue = new LinkedList<>();for(int[] nums:people) queue.add(nums[1],nums);return queue.toArray(new int[people.length][2]);}
}