56、合并区间
是做了力扣435、452有的相同的思维
interval[i][0] | interval[i][1] |
1 | 3 |
2 | 6 |
8 | 10 |
15 | 18 |
学习list转二维数组:(13条消息) Java中ArrayList转成二维数组以及int[]数组和ArrayList<Integer>转换_acmug的博客-CSDN博客_java中arraylist转换成数组
class Solution {
public int[][] merge(int[][] intervals) {
//排序是按行排列的
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[]o1,int[]o2){
if(o1[0]>o2[0]){
return 1;
}else if(o1[0]<o2[0]){
return -1;
}else{
return 0;
}
}
});
List<int[]> list = new ArrayList<>();
//直接 add 的情况:当为第一行或者相邻两行无重叠时
//解释:两行无重叠,即对应在 merge 中上一行的第 1 列小于本行第 0 列
for (int i = 0; i < intervals.length; i++) {
if (list.size() == 0 || list.get(list.size() - 1)[1] < intervals[i][0]) {
list.add(new int[]{intervals[i][0], intervals[i][1]});
} else {//合并的情况:当有重叠时,将 merge 中上一行的右边界更新
list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1], intervals[i][1]);
}
}
//转化成二维数组(学习)
return list.toArray(new int[list.size()][]);
}
}
744、寻找比目标字母大的最小字母
法一:暴力解法——O(n)
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
for(int i=0;i<letters.length;i++){
if(letters[i]>target){
return letters[i];
}
}
return letters[0];//字母是循环出现的,找不到target的后一位字母,就返回第一个
}
}
法二:二分查找——O(logn)
因为该数组是有序的,并且又有target,所以让人想到使用二分查找
注意:
不能直接返回mid的后一个元素,因为如下例子:
["e","e","e","e","e","e","n","n","n","n"] target="e" letter[mid]=letters[4]="e"
这时候letters[mid]==target 并且letter[mid+1]="e"
if(letters[mid]==target){
return letters[mid+1];
}
完整代码
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
if(target>=letters[letters.length-1]) return letters[0];
int left=0,right=letters.length-1;
while(left<=right){
//当 letters[mid] == target 时,也在区间 [mid + 1, right] 中查找,
//因为题目要求查找比目标字母大的最小字母,所有得在查找到 letters[mid] == target 时,还需要在 mid 的右侧查找。
int mid=left+(right-left)/2;
if(letters[mid]>target){
right=mid-1;
}else if(letters[mid]<=target){
left=mid+1;
}
}
return letters[left] ;
}
}
// if(letters[mid]==target){
// return letters[mid+1]; 不能直接返回mid的后一个元素,因为如下例子:
// ["e","e","e","e","e","e","n","n","n","n"] target="e" letter[mid]=letters[4]="e"
// 这时候letters[mid]==target 并且letter[mid+1]="e"