代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字
56.合并区间
思路:先让二维数组进行排序;
遍历数组,定义一个min表示重合区间的左边界,max表示重合区间的右边界;
如果当前区间左边大于max,就证明重合区间断了,就要对它进行加入ArrayList;然后更新min和max就是当前数组的左边界和右边界。
反正,就证明是重合区间。更新max。
这里中了一个小坑:让当前区间的左边和上一个区间的右边作比较,来判断是不是重合区间。显然[1,6],[2,4],这种[2,4]被包含在重合区间里面,就只能用重合区间的右边界。
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals,(a,b)->a[0]-b[0]);List<int[]> list=new ArrayList<>();int min=intervals[0][0];int max=intervals[0][1];for(int i=1; i<intervals.length; i++){if(intervals[i][0]>max){// list.add(new int[]{min,intervals[i-1][1]});list.add(new int[]{min,max});min=intervals[i][0];max=intervals[i][1];}else{max=Math.max(intervals[i][1],max);}}list.add(new int[]{min,max});return list.toArray(new int[list.size()][]);}
}
738.单调递增的数字
暴力法会超时!
可以借助字符串。
因为找一个数字的最大递增数字,就是让迭代让前一个数字-1并且后一个数字变成9,就可以实现。
思路:现将数字转变为字符串,然后从后往前遍历,如果遇到前一个数字比后一个数字大,就让当前数字-1,然后记录当前数字的位置start。
遍历完数字后,就可以再从start位置开始将后面的数字都变成9。
class Solution {public int monotoneIncreasingDigits(int n) {String s=String.valueOf(n);char[] chars=s.toCharArray();int start=s.length();for(int i=chars.length-2; i>=0; i--){if(chars[i]>chars[i+1]){chars[i]--;start=i+1;}}for(int i=start; i<chars.length; i++){chars[i]='9';}return Integer.parseInt(String.valueOf(chars));}
}