代码随想录五刷day9

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


贪心算法

一、力扣455. 分发饼干

在这里插入代码片class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        if(s.length == 0){
            return 0;
        }
        int res = 0;
        for(int i = 0, j = 0; i < g.length && j < s.length; ){
            if(s[j] >= g[i]){
                i ++;
                j ++;
                res ++;
            }else{
                j ++;
            }
        }
        return res;
    }
}

二、力扣376. 摆动序列

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length == 0 || nums.length == 1){
            return nums.length;
        }
        int[] flag = new int[nums.length-1];
        List<Integer> list = new ArrayList<>();
        for(int i = 0, j = 1; j < nums.length; i ++,j ++){
            if(nums[j] - nums[i] > 0){
                flag[i] = 1;
            }else if(nums[j] - nums[i] < 0){
                flag[i] = -1;
            }else{
                flag[i] = 0;
            }
        }
        for(int i = 0; i < flag.length; i ++){
            if(flag[i] == 0){
                continue;
            }
            if(!list.isEmpty()){
                if(list.get(list.size()-1) != flag[i]){
                    list.add(flag[i]);
                }
            }else{
                list.add(flag[i]);
            }
        }
        return list.size()+1;
    }
}

三、力扣53. 最大子数组和

在这里插入代码片class Solution {
    public int maxSubArray(int[] nums) {
        int res = nums[0];
        int sum = 0;
        for(int i = 0; i < nums.length; i ++){
            res = Math.max(res, nums[i]);
            if(sum + nums[i] < 0){
                sum = 0;
            }else{
                sum += nums[i];
                res = Math.max(res, sum);
            }
        }
        return res;
    }
}

四、力扣122. 买卖股票的最佳时机 II

class Solution {
    public int maxProfit(int[] prices) {
        int res = 0;
        for(int i = 1; i < prices.length; i ++){
            res += prices[i] - prices[i-1] > 0 ? prices[i] - prices[i-1] : 0;
        }
        return res;
    }
}

五、力扣55. 跳跃游戏

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length == 1){
            return true;
        }
        int coverRange = 0;
        for(int i = 0; i <= coverRange; i ++){
            coverRange = Math.max(coverRange, i +nums[i]);
            if(coverRange >= nums.length -1){
                return true;
            }
        }
        return false;
    }
}

六、力扣45. 跳跃游戏 II

class Solution {
    public int jump(int[] nums) {
        if(nums.length == 1){
            return 0;
        }
        int cur = 0, max = 0,res = 0;
        for(int i = 0; i <= nums.length; i ++){
            max = Math.max(max, nums[i] + i);
            if(max >= nums.length-1){
                res ++;
                break;
            }
            if(cur == i){
                cur = max;
                res ++;
            }
        }
        return res;
    }
}

七、力扣1005. K 次取反后最大化的数组和

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        int j = 0;
        for(int i = 0; i < nums.length; i ++){
            if(nums[i] <= 0){
                nums[i] = -nums[i];
                k --;
                j = i;
                if(k <= 0){
                    break;
                }
            }else if(k % 2 == 1){
                if(i == 0){
                    nums[i] = -nums[i];
                    k = 0;
                    break;
                }else if(nums[i-1] == 0){
                    k = 0;
                    break;
                }else{
                    if(nums[i] > nums[i-1]){
                        nums[i-1] = -nums[i-1];
                    }else{
                        nums[i] = -nums[i];
                    }
                    k = 0;
                    break;
                }
            }
        }
        if(k % 2 == 1){
            nums[nums.length-1] = -nums[nums.length-1];
        }
        int res = 0;
        for(int a : nums){
            res += a;
        }
        return res;
    }
}

八、力扣134. 加油站

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)%gas.length;
                curSum = 0;
            }
        }
        if(totalSum < 0){
            return -1;
        }
        return index;
    }
}

九、力扣135. 分发糖果

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int[] arr = new int[n];
        Arrays.fill(arr, 1);
        if(n == 1){
            return 1;
        }
        for(int i = 1; i < n; i ++){
            if(ratings[i] > ratings[i-1]){
                arr[i] = arr[i-1]+1;
            }
        }
        for(int i = n-2; i >= 0; i --){
            if(ratings[i] > ratings[i+1]){
                arr[i] = Math.max(arr[i], arr[i+1]+1);
            }
        }
        return Arrays.stream(arr).sum();
    }
}

十、力扣860. 柠檬水找零

class Solution {
    public boolean lemonadeChange(int[] bills) {
        boolean flag = false;
        int five = 0, ten = 0, twen = 0;
        for(int i = 0; i < bills.length; i ++){
            switch (bills[i]){
                case 5 : 
                five ++;break;

                case 10 :
                if(five < 1){
                    return false;
                }
                ten ++;
                five --;
                break;

                case 20 :
                if(ten >= 1 && five >= 1){
                    ten --;
                    five --;
                    twen ++;
                    break;
                }else if(five >= 3){
                    five -= 3;
                    twen ++;
                    break;
                }else{
                    return false;
                }
                
            }
        }
        return true;
    }
}

十一、力扣406. 根据身高重建队列

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];
            }
        });
        LinkedList<int[]> list = new LinkedList<>();
        for(int[] p : people){
            list.add(p[1],p);
        }
        return list.toArray(new int[people.length][2]);
    }
}

十二、力扣452. 用最少数量的箭引爆气球

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int n = points.length;
        if(n == 1){
            return 1;
        }
        int res = 1, min = points[0][1];
        for(int i = 1; i < n; i ++){
            if(points[i][0] <= min){
                min = Math.min(min, points[i][1]);
            }else{
                res ++;
                min = points[i][1];
            }
        }
        return res;
    }
}

十三、力扣435. 无重叠区间

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a,b) ->{
            return Integer.compare(a[0],b[0]);
        });
        int res = 0, count = 1;
        if(intervals.length == 1){
            return 0;
        }
        for(int i = 1; i < intervals.length; i ++){
            if(intervals[i][0] >= intervals[i-1][1]){
                count ++;
            }else{
                intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
            }
        }
        return intervals.length - count;
    }
}

十四、力扣763. 划分字母区间

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new ArrayList<>();
        char[] ch = s.toCharArray();
        int[] arr = new int[26];
        for(int i = 0; i < ch.length; i ++){
            arr[ch[i] - 'a'] = i;
        }
        int idx = 0;
        int last = -1;
        for(int i = 0; i < ch.length; i ++){
            idx = Math.max(idx, arr[ch[i] - 'a']);
            if(i == idx){
                res.add(i - last);
                last = i;
            }
        }
        return res;
    }
}

十五、力扣56. 合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->{
            return Integer.compare(a[0],b[0]);
        });
        if(intervals.length == 1){
            return intervals;
        }
        List<int[]> res = new ArrayList<>();
        int left = intervals[0][0], right = intervals[0][1];
        for(int i = 1; i < intervals.length; i ++){
            if(intervals[i][0] <= intervals[i-1][1]){
                right = Math.max(right,intervals[i][1]);
                intervals[i][1] = Math.max(intervals[i][1], intervals[i-1][1]);
            }else{
                int[] cur = new int[]{left, right};
                res.add(cur);
                left = intervals[i][0];
                right = intervals[i][1];
            }
        }
        res.add(new int[]{left,right});
        return res.toArray(new int[res.size()][]);
    }
}

十六、力扣738. 单调递增的数字

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] ch = s.toCharArray();
        int start = ch.length;
        for(int i = ch.length-2; i >= 0; i --){
            if(ch[i] > ch[i+1]){
                ch[i]--;
                start = i+1;
            }
        }
        for(int i = start; i < ch.length; i ++){
            ch[i] = '9';
        }
        return Integer.parseInt(String.valueOf(ch));
    }
}

十七、力扣968. 监控二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int minCameraCover(TreeNode root) {
        int[] res = fun(root);
        return res[0] == 0 ? res[1] + 1 : res[1];
    }
    // 0 未监控 、 1 已监控 、 2 已安装           
    public int[] fun(TreeNode root){
        if(root == null){
            return new int[]{1,0};
        }
        int[] l = fun(root.left);
        int[] r = fun(root.right);
        int[] cur = new int[2];
        if(l[0] == 0 || r[0] == 0){
            cur[0] = 2;
            cur[1] = l[1] + r[1] + 1;
        }else if(l[0] == 2 || r[0] == 2){
            cur[0] = 1;
            cur[1] = l[1] + r[1];
        }else{
            cur[0] = 0;
            cur[1] = l[1] + r[1];
        }
        return cur;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱世在摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值