56. 合并区间
题目讲解:56. 合并区间 - 力扣(LeetCode)
讲解链接:代码随想录
和昨天的思路一致 这个是优先用左区间排列
Java代码:
class Solution {public int[][] merge(int[][] intervals) {List<int[]> ans = new LinkedList<>();//按照左边界排序Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));//initial start 是最小左边界int start = intervals[0][0];int rightmostrightbound = intervals[0][1];for(int i = 1; i < intervals.length; i++){//如果左边界大于最大右边界if(intervals[i][0] > rightmostrightbound){//加入区间 并且更新startans.add(new int[]{start, rightmostrightbound});start = intervals[i][0];rightmostrightbound = intervals[i][1];}else{//更新最大右边界rightmostrightbound = Math.max(rightmostrightbound, intervals[i][1]);}}ans.add(new int[]{start, rightmostrightbound});return ans.toArray(new int[ans.size()][]);}
}
738.单调递增的数字
题目链接:738. 单调递增的数字 - 力扣(LeetCode)
讲解链接:代码随想录
由局部最优求出全局最优解 没有反例就贪心
Java代码:
class Solution {public int monotoneIncreasingDigits(int n) {String s = String.valueOf(n);char[] chars = s.toCharArray();//332int start = s.length();//3for (int i = s.length() - 2; i >= 0; i--) {//从后往前遍历if (chars[i] > chars[i + 1]) {//332的十位数减一 百位数减一 变为222chars[i]--;start = i + 1;}}for (int i = start; i < s.length(); i++) {chars[i] = '9';//i = 1 把222 改成 299}return Integer.parseInt(String.valueOf(chars));}
}
贪心总结
由局部最优得出全局最优 如果没有反例 就尝试贪心
接下来是动态规划 最最最难的一集 加油继续坚持 在贪心这里我不熟悉的地方就是重叠区间的选择和判断 需要再练习