《代码随想录》贪心算法:加油站
本题的完整题目如下:
本题的完整思路如下: 1.定义两个变量,分别记录当前油量和总的汽油量 2.循环,将当前加油站的油减去到达下一个站点所需要消耗的油累加到之前定义的两个变量上,接下来判断,如果当前油量小于0,则将当前油量置为0,并将结果值记录为i+1。注意在整个过程中,总的油量是一直在累加的。 3.到最后,循环结束后,判断总的油量是否大于等于0,如果大于等于0,则返回结果值。否则返回-1. 本题的完整代码如下:
//134.加油站
class Solution8 {
public int canCompleteCircuit(int[] gas, int[] cost) {
int startindex = 0;
int curgas = 0;
int totalgas = 0;
for (int i = 0; i < gas.length; i++) {
curgas += gas[i] - cost[i];
totalgas += gas[i] - cost[i];
if(curgas < 0) {
curgas = 0;
startindex = i + 1;
}
}
return totalgas >= 0 ? startindex : -1;
}
}
《代码随想录》贪心算法:分发糖果
本题的完整题目如下所示:
本题的完整思路如下所示: 1.首先,本题先解决一边,再解决另一边。首先创建一个与原数组大小相同的糖果数组,并且将初始值置为1. 2.接下来循环,判断右边的孩子是否大于左边的孩子,如果是,则给右边的孩子对应的糖果数值加1.如果不是大于,则不做任何操作。 3.这边判断完以后,判断另一边。从后往前遍历。如果左边的孩子大于右边的孩子,则给左边的孩子对应的糖果数值加1,但是该数值并不是直接赋值给该孩子对应的糖果数值。因为,这样的话,很可能不满足第一次遍历后的结果了。所以此时需要在该结果与原本的结果中去一个最大值,作为结果。 本题的完整代码如下所示:
//135.分发糖果
class Solution9 {
public int candy(int[] ratings) {
int[] candies = new int[ratings.length];
// 每个孩子至少分配 1 个糖果
for (int i = 0; i < candies.length; i++) {
candies[i] = 1;
}
//右孩子比左孩子大
for(int i = 1; i < ratings.length; i++) {
if(ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
}
}
//左孩子比右孩子大
for(int j = ratings.length - 2; j >= 0; j--) {
if(ratings[j] > ratings[j + 1]) {
candies[j] = Math.max(candies[j + 1] + 1, candies[j]);
}
}
int sum = 0;
for(int k : candies) {
sum+=k;
}
return sum;
}
}
《代码随想录》贪心算法:柠檬水找零
本题的完整题目如下所示:
本题的完整思路如下所示: 1.首先定义两个数,分别记录当前售货员有的5元与10元的纸钞数。 2.循环,如果当前给的钱是5元,则直接给对应的5元数+1.如果是10元,则判断当前所拥有5元数是否大于0,如果大于0,则5元的数量-1,10元的数量+1.否则,就返回false。如果是20元,则判断5元数量与10元数量是否都大于0,如果大于,则将二者的值都减去1,如果不满足再判断,5元的数量是否大于等于3,如果满足,则5元的数量减去3.否则,就返回false。 3.最后循环结束,返回true。 本题的完整代码如下所示:
//860.柠檬水找零
class Solution10 {
public boolean lemonadeChange(int[] bills) {
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) {
five++;
} else if (bill == 10) {
if (five == 0) {
return false;
}
five--;
ten++;
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
}
《代码随想录》贪心算法:根据身高重建队列
本题的完整题目如下:
本题的完整思路如下: 1.本题首先需要根据身高值进行从大到小排序,这样就能保证,在后续调整的时候后边的数移到前边,不会影响排序。 2.排好序后,再根据第二个数值进行判别,第二个数为几,就将其插入到索引为几的位置。 3.本题的难点就是,思路,一般很难想到。 本题的完整代码如下:
//406.根据身高重建队列
class Solution11 {
public int[][] reconstructQueue(int[][] people) {
// 身高从大到小排(身高相同k小的站前面)
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1]; // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列
return b[0] - a[0]; //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列
});
LinkedList<int[]> que = new LinkedList<>();
for(int[] p : people) {
que.add(p[1],p);
}
return que.toArray(new int[people.length][]);
}
}