端子网站建设江苏网站推广
1. 合并区间
力扣
涉及重叠区间问题,首先仍然是将所有元素进行排序。用一个start和end记录当前重叠的区间,如果当前遍历到的元素左边界小于等于区间边界,则更新区间右边界end;如果没有交叉,则将当前区间记录到结果,同时更新start和end。注意全部遍历完之后要将最后一个start -> end区间加到结果里。
class Solution {public int[][] merge(int[][] intervals) {List<int []> res = new LinkedList<>();Arrays.sort(intervals,(a,b)->(a[0] - b[0]));int start = intervals[0][0];int end = intervals[0][1];for(int i = 1; i < intervals.length; i++){if(intervals[i][0] <= end){end = Math.max(intervals[i][1], end);}else{res.add(new int[]{start, end});start = intervals[i][0];end = intervals[i][1];}}res.add(new int[]{start, end});return res.toArray(new int[res.size()][]);}
}
2. 单调递增的数字
力扣
本题涉及字符串、字符数组和整数的互相替换,要掌握相关的方法。
对于非递增的情况,如98,strNum[i - 1] > strNum[i],要将strNum[i - 1]–,strNum[i]和后面的部分都置为9。然后要考虑遍历的方向。如果从前向后遍历,会出现332变成329,前面变得非递增了,所以只能从后往前遍历。
class Solution {public int monotoneIncreasingDigits(int n) {String s = String.valueOf(n);char[] chars = s.toCharArray();int start = s.length();for(int i = s.length() - 1; i > 0; i--){if(chars[i - 1] > chars[i]){chars[i - 1]--;start = i;}}for(int i = start; i < chars.length; i++){chars[i] = '9';}return Integer.parseInt(String.valueOf(chars));}
}
3. 监控二叉树
二刷补上