贪心专项练习LeetCode

455. 分发饼干
image-20221016135012971

class Solution {
        public int findContentChildren(int[] g, int[] s) {
            int sum = 0, index = 0;
            Arrays.sort(g);
            Arrays.sort(s);
            for (int i = 0; i < s.length && index < g.length; i++) {
                if(g[index] <= s[i]){
                    sum++;
                    index++;
                }
            }
            return sum;
        }
    }

376. 摆动序列

image-20221016140105696

class Solution {
        public int wiggleMaxLength(int[] nums) {
            if (nums.length <= 1) {
                return nums.length;
            }
            int now = 0;
            int pre = 0;
            int sum = 1;
            for (int i = 1; i < nums.length; i++) {
                now = nums[i] - nums[i - 1];
                boolean b = (now > 0 && pre <= 0) || (now < 0 && pre >= 0);
                if (b) {
                    sum++;
                    pre = now;
                }
            }
            return sum;
        }
    }

53. 最大子数组和

image-20221016140742960

class Solution {
        public int maxSubArray(int[] nums) {
            int now = 0;
            int ans = Integer.MIN_VALUE;
            for (int i = 0; i < nums.length; i++) {
                now += nums[i];
                if(now > ans){
                    ans = now;
                }
                if(now < 0){
                    now = 0;
                }
            }
            return ans;
        }
    }

122. 买卖股票的最佳时机 II
image-20221017085256898

class Solution {
        public int maxProfit(int[] prices) {
            int ans = 0;
            for (int i = 1; i < prices.length; i++) {
                ans += Math.max(prices[i] - prices[i - 1], 0);
            }
            return ans;
        }
    }

55. 跳跃游戏
image-20221017104055660

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

45. 跳跃游戏 II
image-20221017110000647

class Solution {
        public int jump(int[] nums) {
            int ans = 0;
            int next = 0;
            int temp = 0;
            for (int i = 0; i <= next && next < nums.length - 1; i++) {
                //记录当前位置的最远
                temp = Math.max(temp, i + nums[i]);
                if(i == next){
                    next = temp;
                    ans++;
                }
            }
            return ans;
        }
    }

[https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/](1005. K 次取反后最大化的数组和 “https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/”)

image-20221017115359596

class Solution {
        public int largestSumAfterKNegations(int[] nums, int k) {
            if (nums.length == 1) {
                return k % 2 == 0 ? nums[0] : -nums[0];
            }
            Arrays.sort(nums);
            int sum = 0;
            int index = 0;
            for (int i = 0; i < k; i++) {
                if (i < nums.length - 1 && nums[index] < 0) {
                    nums[index] = -nums[index];
                    //判断是否要右移
                    //index指向变负后代价最小的值
                    if (nums[index] >= Math.abs(nums[index + 1])) {
                        index++;
                    }
                    continue;
                }
                nums[index] = -nums[index];
            }
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
            }
            return sum;
        }
    }

134. 加油站

image-20221018093604387

有一段为负 就不考虑从那段开始
总体为负 则不能一周

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

135. 分发糖果

image-20221018122126191

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

860. 柠檬水找零

给20诏令 有10块给10块+5块 没有就3张5块

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++;
                } else if (bills[i] == 10) {
                    five--;
                    ten++;
                } else {
                    if (ten > 0) {
                        ten--;
                        five--;
                    } else {
                        five -= 3;
                    }
                }
                if(five < 0 || ten < 0){
                    return false;
                }
            }
            return true;
        }
    }

406. 根据身高重建队列

image-20221018125127099

class Solution {
        public int[][] reconstructQueue(int[][] people) {
            // 身高从大到小排(身高相同k小的站前面)
            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][]);
        }
    }

452. 用最少数量的箭引爆气球

image-20221019190737883

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

435. 无重叠区间

image-20221019191539150

class Solution {
        public int eraseOverlapIntervals(int[][] intervals) {
            Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
            int remove = 0;
            int pre = intervals[0][1];
            for (int i = 1; i < intervals.length; i++) {
                if(pre > intervals[i][0]){
                    remove++;
                    //去掉右 长的集合
                    pre = Math.min(pre,intervals[i][1]);
                }
                else{
                    pre = intervals[i][1];
                }
            }
            return remove;
        }
    }

763. 划分字母区间

image-20221019194045540

class Solution {
        public List<Integer> partitionLabels(String s) {
            List<Integer> ans = new ArrayList<>();
            int[] mp = new int[30];
            char[] c = s.toCharArray();
            for (int i = 0 ; i < c.length; i++) {
                mp[c[i] - 'a'] = i;
            }
            int index = 0;
            int now = -1;
            for (int i = 0; i < c.length; i++) {
                index = Math.max(index, mp[c[i] - 'a']);
                if (i == index) {
                    ans.add(i - now);
                    now = i;
                }
            }
            return ans;
        }
    }

56. 合并区间

image-20221019200905588

class Solution {
        public int[][] merge(int[][] intervals) {
            LinkedList<int[]> res = new LinkedList<>();
            Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
            res.add(intervals[0]);
            for (int i = 1; i < intervals.length; i++) {
                if (intervals[i][0] <= res.getLast()[1]) {
                    int start = res.getLast()[0];
                    int end = Math.max(intervals[i][1], res.getLast()[1]);
                    res.removeLast();
                    res.add(new int[]{start, end});
                }
                else {
                    res.add(intervals[i]);
                }
            }
            return res.toArray(new int[res.size()][]);
        }
    }

738. 单调递增的数字

image-20221020095215883

class Solution {
        public int monotoneIncreasingDigits(int n) {
            String s = String.valueOf(n);
            char[] chars = s.toCharArray();
            int start = s.length();
            //每遇到后比前小 就把前-1 并标记
            for (int i = s.length() - 2; i >= 0; i--) {
                if (chars[i] > chars[i + 1]) {
                    chars[i]--;
                    start = i + 1;
                }
            }
            for(int i = start;i < s.length();i++){
                chars[i] = '9';
            }
            return Integer.parseInt(String.valueOf(chars));
        }
    }

714. 买卖股票的最佳时机含手续费

image-20221020103042328

class Solution {
        public int maxProfit(int[] prices, int fee) {
            int buy = prices[0] + fee;
            int sum = 0;
            for (int p : prices) {
                if (p + fee < buy) {
                    buy = p + fee;
                } else if (p > buy) {
                    sum += p - buy;
                    buy = p;
                }
            }
            return sum;
        }
    }

968. 监控二叉树
image-20221020103659183

class Solution {
        int res = 0;

        int minCame(TreeNode root) {
            if (root == null) {
                return 2;
            }
            int left = minCame(root.left);
            int right = minCame(root.right);
            if (left == 2 && right == 2) {
                return 0;
            }else if(left == 0 || right == 0){
                res++;
                return 1;
            }else{
                return 2;
            }
        }

        public int minCameraCover(TreeNode root) {
            if(minCame(root) == 0){
                res++;
            }
            return res;
        }
    }

贪心完结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楠风丶北枝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值