首页 > 编程语言 >代码随想录第三十六天|贪心算法

代码随想录第三十六天|贪心算法

时间:2022-11-17 15:34:08浏览次数:71  
标签:int 随想录 merge intervals new 第三十六 o2 o1 贪心

今天继续是贪心算法

 

 

435. 无重叠区间

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

和昨天射箭的那道题一样的思路,先把数组按最远的区间进行排列。然后去判断是否重合就可以了。

 

763.划分字母区间 

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new ArrayList<>();
        HashMap<Character, Integer> map = new HashMap<>();
        int start = 0;
        int end = 0;

        for (int i = 0; i< s.length(); i++){
            map.put(s.charAt(i), i);
        }

        for (int i = 0; i< s.length(); i++){
            end = Math.max(end, map.get(s.charAt(i)));
            if (i == end){
                res.add(end - start +1);
                start = i + 1;
            }
        }
        return res;
    }
}

用HashMap,如果有新的重复字母出现,就把end扩展

56. 合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
         //思路:
        //1.先将二维数组每一行按第一列排序得到诸如 [ [0,2], [1,5], [6,8], [10,11] ]
        //2.循环遍历每一行,给结果数组添加数据,有以下添加情况
        //3.对于结果数组 merge 的第一行,直接 add 进去即先将 [0,2] 添加
        //4.对于 merge 的其他行,若无重叠也直接添加如 [6,8], [10,11]
        //5.若有重叠,则修改上一行如 [0,2], [1,5] -> [0,5]

        int n = intervals.length;

        //通过 sort 函数对二维数组每一行按第一列元素进行排序
        //重写比较器方法,o1[] - o2[] 表示当 o1 大于 o2 时,将 o1 放在 o2 后面,即基本的升序排序
        //而 o1[0] - o2[0] 表示按二维数组的每一行第一列元素排序,类似的 o[1] - o2[1]代表按第二列进行排序
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        List<int[]> merge = new ArrayList<int[]>();

        for (int i = 0; i < n; i++) {

            //创建变量指向每行的左右元素(两列)
            int left = intervals[i][0];
            int right = intervals[i][1];

            //直接 add 的情况:当为第一行或者相邻两行无重叠时
            //解释:两行无重叠,即对应在 merge 中上一行的第 1 列小于本行第 0 列
            if (merge.size() == 0 || merge.get(merge.size() - 1)[1] < left) {
                merge.add(new int[]{left, right});
            }
            //合并的情况:当有重叠时,将 merge 中上一行的右边界更新
            else {
                merge.get(merge.size() - 1)[1] = Math.max(merge.get(merge.size() - 1)[1], right);
            }
        }
        //可以学习下此种将 list 转二维数组的方法
        return merge.toArray(new int[merge.size()][]);
    }
}

想不出来这道题

今天的题都是区间问题,除了最后一道题外都还好

标签:int,随想录,merge,intervals,new,第三十六,o2,o1,贪心
From: https://www.cnblogs.com/catSoda/p/16899648.html

相关文章

  • 代码随想录Day25
    LeetCode404.左叶子之和计算给定二叉树的所有左叶子之和。   思路:首先由于计算左叶子之和,所以遍历的顺序一定是左在前,选用左右中的后续遍历进行递归比较合适。......
  • 代码随想录day1---LeetCode704二分查找&27移除元素
    LeetCode704二分查找[https://leetcode.cn/problems/binary-search/]题目:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的......
  • 代码随想录算法训练营Day01|704. 二分查找、27. 移除元素
    代码随想录算法训练营Day01|704.二分查找、27.移除元素704.二分查找题目链接:704.二分查找首先注意题干的描述:题干描述说明了元素是升序排列的,否则需要调用sort进行......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    目录两道题704.二分查找27.移除元素省流两道题704.二分查找  1、数组算是最简单,也最不抽象的数据结构了。二分法,我也在学习路上听过不少次,所以是实际实现也很快,没有......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。
    今日任务数组理论基础,704.二分查找,27.移除元素1数组理论基础文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html......
  • 代码随想录第三十五天 | 贪心算法
     第三十五天,继续贪心 860.柠檬水找零 classSolution{publicbooleanlemonadeChange(int[]bills){intn=bills.length;if(bills[0......
  • javascript-代码随想录训练营day1
    704.二分查找力扣题目链接:https://leetcode.cn/problems/binary-search/题目描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums......
  • 代码随想录Day24
    LeetCode257二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:思路:终止逻辑:走到叶子节点,所以原本终止......
  • 20221115_T3A+_贪心二分
    题意你在和Yazid做游戏。Yazid给了你一棵\(n\)个节点的树,并让你删除这棵树上的恰好\(k\)条边,使得整棵树被分成\(k+1\)个连通块。你觉得太简单了,随便删k条边......
  • 代码随想录第三十四天|贪心算法
    今天继续贪心算法,重点是学习贪心算法的思维 1005.K次取反后最大化的数组和 classSolution{publicintlargestSumAfterKNegations(int[]nums,intk){......