Comparator比较器的使用
435. 无重叠区间 - 力扣(LeetCode) (leetcode-cn.com)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
🧠思路:
1.我们只需要对每一段区间的右边界进行排序,从左向右遍历即可
2.遍历时判断每一段区间的左边界是否小于当前记录的右边界,如果小于就记录交叉区间+1
3.直到右边界与左边界没有交叉区间
4.更新右边界继续判断
- 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。
- 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。
- 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。
- 难点四:求最大非重复区间个数时,需要一个分割点来做标记。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length < 2) return 0;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
int count = 0;
int edge = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < edge) {
count++;
} else {
edge = intervals[i][1];
}
}
return count;
}
}
通过这道题学会了Comparator这样的一个比较器的使用
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
//o1[1] - o2[1]>0就交换两个元素的位置,即升序排列
return o1[1] - o2[1];
}
});
手测代码验证:
public class Test {
public static void main(String[] args) {
Integer[] nums = new Integer[]{1,4,0,2,5,4};
Arrays.sort(nums,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
System.out.println(Arrays.toString(nums));
}
}
索引小记
关于在一张表abc三个列和ab两个列上边建立索引,当where条件查询a时走哪个索引的问题
首先创建一张表
CREATE TABLE `test1`(
`a` INT,
`b` VARCHAR(100) NOT NULL,
`c` VARCHAR(40) NOT NULL
);
然后建立索引
CREATE INDEX ind_abc ON test1 (a,b,c)
CREATE INDEX ind_ab ON test1 (a,b)
然后用explain查看走的哪个索引
EXPLAIN SELECT * FROM test1 WHERE a = 0;
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
sql语句执行顺序 | 根据此字段可以看到当前查询类型 | 显示这一行数据是关于哪一个表查询 | 该列显示的为分区表命中的分区情况。非分区表该字段为空(null)。 | 表示访问类型 | 显示可能应用在这张表中的索引,一个或多个 查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。 | 如果为NULL 则没有使用索引。 | 表示索引中使用的字节数,可通过该列计算查询中使用索引的长度 | 显示索引的哪一列被使用了,如果可能的话,是一个常量 | 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 | 它指返回结果的行占需要读到的行(rows列的值)的百分比 | 额外信息 |
1 | SIMPLE | test1 | (null) | ref | ind_abc | ind_abc | 4 | const | 1 | 100 | Using index |
如果我们把ind_abc删除重新建立索引的话那么就会走Ind_ab索引
所以最后能得出结论:abc和ab哪个索引最先建立,就会走哪个索引