程式碼隨想錄演算法訓練營 | 134. 加油站,135. 分發糖果,860.檸檬水找零,406.根據身高重建佇列

漪欢酒發表於2024-10-04

134. 加油站
題目連結:134. 加油站
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰加油站
日期:2024-10-04

想法:1.總汽油大於等於消耗一定能跑完,2.當前剩餘汽油小於0了,只能從下一站開始重新計算
Java程式碼如下:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int curSum = 0;
        int totalSum = 0;
        int index = 0;
        for (int i = 0; i < gas.length; i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if (curSum < 0) {
                index = i + 1; 
                curSum = 0;
            }
        }
        if (totalSum < 0) return -1;
        return index;
    }
}

135. 分發糖果
題目連結:135. 分發糖果
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰分發糖果
日期:2024-10-04

想法:兩次貪心:一次是從左到右遍歷,比較右邊評分比左邊大的情況,一次是從右到左遍歷,比較左邊評分比右邊大的情況。
Java程式碼如下:

class Solution {
    public int candy(int[] ratings) {
        int[] candyVec = new int[ratings.length];
        candyVec[0] = 1;
        for(int i = 1; i < ratings.length; i++) {
            if(ratings[i] > ratings[i - 1]) {
                candyVec[i] = candyVec[i - 1] + 1;
            }else{
                candyVec[i] = 1;
            }
        }
        for(int i = ratings.length - 2; i >= 0; i--) {
            if(ratings[i] > ratings[i + 1]) {
                candyVec[i] = Math.max(candyVec[i + 1] + 1, candyVec[i]);
            }
        }
        int res = 0;
        for(int candy : candyVec) {
            res += candy;
        }
        return res;
    }
}

總結:每次考慮一個方向才能不亂。

860.檸檬水找零
題目連結:860.檸檬水找零
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰檸檬水找零
日期:2024-10-04

想法:5, 10沒有選擇;20的話優先消耗10和5,如果沒有10再消耗3張5
Java程式碼如下:

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        for(int i = 0; i < bills.length; i++) {
            if(bills[i] == 5) {
                five++;
            }
            if(bills[i] == 10) {
                if(five <= 0) return false;
                five--;
                ten++;
            }
            if(bills[i] == 20) {
                if(five > 0 && ten > 0) {
                    five--;
                    ten--;
                }else if(five >= 3) {
                    five -= 3;
                }else {
                    return false;
                }
            }
        }
        return true;
    }
}

406.根據身高重建佇列
題目連結:406.根據身高重建佇列
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰根據身高重建佇列
日期:2024-10-04

想法:按照從高往低排,再從前到後按K值插入。
Java程式碼如下:

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];
            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][]);
    }
}

相關文章