《代码随想录》Day29打卡!

《代码随想录》贪心算法:加油站

本题的完整题目如下:

本题的完整思路如下: 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][]);
    }
}
相关推荐
飞yu流星1 小时前
C++ 函数 模板
开发语言·c++·算法
没有名字的鬼1 小时前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构
pursuit_csdn1 小时前
力扣 74. 搜索二维矩阵
算法·leetcode·矩阵
labuladuo5201 小时前
洛谷 P8703 [蓝桥杯 2019 国 B] 最优包含(dp)
算法·蓝桥杯·动态规划
Milk夜雨2 小时前
C语言冒泡排序教程简介
数据结构·算法·排序算法
委婉待续2 小时前
redis的学习(三)
数据结构·算法
一直学习永不止步2 小时前
LeetCode题练习与总结:随机翻转矩阵--519
java·数学·算法·leetcode·哈希表·水塘抽样·随机化
xiao--xin2 小时前
LeetCode100之组合总和(39)--Java
java·开发语言·算法·leetcode·回溯
IT猿手4 小时前
部落竞争与成员合作算法(CTCM)求解5个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
深度学习·算法·机器学习·matlab·无人机·无人机、
GISer_Jing4 小时前
React中 Reconciliation算法详解
前端·算法·react.js