8-17小记

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.更新右边界继续判断

435.无重叠区间

  • 难点一:一看题就有感觉需要排序,但究竟怎么排序,按左边界排还是右边界排。
  • 难点二:排完序之后如何遍历,如果没有分析好遍历顺序,那么排序就没有意义了。
  • 难点三:直接求重复的区间是复杂的,转而求最大非重复区间个数。
  • 难点四:求最大非重复区间个数时,需要一个分割点来做标记。
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;
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
sql语句执行顺序根据此字段可以看到当前查询类型显示这一行数据是关于哪一个表查询该列显示的为分区表命中的分区情况。非分区表该字段为空(null)。表示访问类型显示可能应用在这张表中的索引,一个或多个 查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。如果为NULL 则没有使用索引。表示索引中使用的字节数,可通过该列计算查询中使用索引的长度显示索引的哪一列被使用了,如果可能的话,是一个常量根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数它指返回结果的行占需要读到的行(rows列的值)的百分比额外信息
1SIMPLEtest1(null)refind_abcind_abc4const1100Using index

如果我们把ind_abc删除重新建立索引的话那么就会走Ind_ab索引

所以最后能得出结论:abc和ab哪个索引最先建立,就会走哪个索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值