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));}
}