加油站
public int canCompleteCircuit(int[] gas, int[] cost) {
int res=0;
int sum=0;
int index=0;
for(int i=0;i<gas.length;i++){
res+=gas[i]-cost[i];
sum+=gas[i]-cost[i];
if(res<0){
index=i+1;
res=0;
}
}
if(sum<0)return -1;
return index;
}
笔试做到一个leetcode的原题,但是难度升级版的加油站问题
计算最低加油次数
总的思想就是当当前油量可以支撑到下一个加油站时就不加油,否则选择经过的最多油的加油站加油
public int minRefuelStops(int target, int startFuel, int[][] stations) {
//最大堆
PriorityQueue<Integer> heap = new PriorityQueue<>(((o1, o2) -> o2 - o1));
int ans = 0;
int curGas = startFuel;
int i = 0;
while (curGas < target) {
//只要当前油量可以支撑到下一个加油站,就选择不加油
if (i < stations.length && curGas >= stations[i][0]) {
heap.add(stations[i][1]);
i++;
} else {
//无法到达,加油
if (!heap.isEmpty()) {
//堆中有元素 证明路过很多加油站,选择最多油的加油站加油
curGas += heap.poll();
ans++;
} else {
//无元素,证明无法到达
return -1;
}
}
}
return ans;
}
分糖果
public int candy(int[] ratings) {
int []left=new int[ratings.length];
int []right=new int[ratings.length];
int res=0;
Arrays.fill(left,1);
Arrays.fill(right,1);
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1])left[i]=left[i-1]+1;
}
for(int i=ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1])right[i]=right[i+1]+1;
}
for(int i=0;i<ratings.length;i++){
res+=Math.max(left[i],right[i]);
}
return res;
}
柠檬水找零
public boolean lemonadeChange(int[] bills) {
int fiveCnt=0,tenCnt=0;
for(int i=0;i<bills.length;i++){
if(bills[i]==5)fiveCnt++;
else if(bills[i]==10){
if(fiveCnt>0){
fiveCnt--;
tenCnt++;
}else{
return false;
}
}else{
if(tenCnt>0){
if(fiveCnt>0){
tenCnt--;
fiveCnt--;
}else{
return false;
}
}else if(fiveCnt>=3){
fiveCnt=fiveCnt-3;
}else{
return false;
}
}
}
return true;
}
根据身高重建队列
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];
});
LinkedList<int[]>que=new LinkedList<>();
for(int []p:people){
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}