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]);
}
}