贪心-demo3

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

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

2.无重叠区间 leetcode 435

在这里插入图片描述

class Solution {
//按区间右侧排序
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(o1,o2)->{
            return o1[1]-o2[1];
        });
        int count = 0;
        int edge = Integer.MIN_VALUE;
        for(int i=0;i<intervals.length;i++){
            if(intervals[i][0]>=edge){
                edge = intervals[i][1];
            }else{
                count++;
            }
        }

        return count;
    }
}

class Solution {
//按区间左侧排序
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(o1,o2)->{
            return o1[0]-o2[0];
        });
        int right = intervals[0][1];
        int count = 0;
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]<right){
                count++;
                right = Math.min(right,intervals[i][1]);
            }else{
                right = intervals[i][1];
            }
        }
        return count;
    }
}

3.划分字母区间 leetcode 763

在这里插入图片描述

class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] hash = new int[27];
        for(int i=0;i<s.length();i++){
            hash[s.charAt(i)-'a'] = i;
        }
        int left = 0;
        int right = 0;
        List<Integer> res = new ArrayList<>(); 
        for(int i=0;i<s.length();i++){
            right = Math.max(right,hash[s.charAt(i)-'a']);
            if(i==right){
                res.add(right-left+1);
                left = i+1;
            }
        }
        return res;
    }
}

4.合并区间 leetcode 56

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

5.单调递增的数字 leetcode 738在这里插入图片描述

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String[] strings = (n+"").split("");
        int index = strings.length;
        for(int i=strings.length-1;i>0;i--){
            if(Integer.parseInt(strings[i])<Integer.parseInt(strings[i-1])){
                strings[i-1] = (Integer.parseInt(strings[i-1])-1)+"";
                index = i;
            }
        }
        for(int i=index;i<strings.length;i++){
            strings[i]="9";
        }
        return Integer.parseInt(String.join("",strings));
    }
}
class Solution {
    public int monotoneIncreasingDigits(int n) {
        if(n==0){
            return 0;
        }
        String s = Integer.toString(n);
        char[] chars = s.toCharArray();
        int start = Integer.MAX_VALUE;
        for(int i=chars.length-1;i>0;i--){
            if(chars[i]<chars[i-1]){
                chars[i-1]--;
                start = i;
            }
        }
        StringBuilder res = new StringBuilder();
        for(int i=0;i<chars.length;i++){
            if(chars[i]=='0'&&i==0){
                continue;
            }
            if(i>=start){
                res.append('9');
            }else{
                res.append(chars[i]);
            }
        }
        return Integer.parseInt(res.toString());
    }
}

6.买卖股票的最佳时机含手续费 leetcode 714在这里插入图片描述

在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int res = 0;
        int buy = prices[0]+fee;
        for(int i=1;i<prices.length;i++){
            buy = Math.min(buy,prices[i]+fee);
            if(prices[i]>buy){
                res += prices[i]-buy;
                buy = prices[i];
            }
        }
        return res;
    }
}

7.监控二叉树 leetcode 968在这里插入图片描述

class Solution {
    int count = 0;
    public int minCameraCover(TreeNode root) {
        if(BFS(root)==0){
            count++;
        }
        return count;
    }
    public int BFS(TreeNode root){
        //设置标记:
        //0代表无覆盖
        //1代表摄像头所在
        //2代表有覆盖
        if(root==null){
            return 2;
        }
        int left = BFS(root.left);
        int right = BFS(root.right);
        if(left==2&&right==2){
            return 0;
        }else if(left==0||right==0){
            count++;
            return 1;
        }else{
            return 2;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值