力扣:我的日程安排 |||(TreeMap的运用)

 输入:
["MyCalendarThree", "book", "book", "book", "book", "book", "book"]
[[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
输出:
[null, 1, 1, 2, 3, 3, 3]

解释:
MyCalendarThree myCalendarThree = new MyCalendarThree();
myCalendarThree.book(10, 20); // 返回 1 ,第一个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(50, 60); // 返回 1 ,第二个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(10, 40); // 返回 2 ,第三个日程安排 [10, 40) 与第一个日程安排相交,所以最大 k 次预订是 2 次预订。
myCalendarThree.book(5, 15); // 返回 3 ,剩下的日程安排的最大 k 次预订是 3 次预订。
myCalendarThree.book(5, 10); // 返回 3
myCalendarThree.book(25, 55); // 返回 3

本来这题都是用的线段树来解决,我实在看不懂,在b站上找到了一个大哥用TreeMap做的,又学到了!!

题意很好理解,只要是在一个时间段,就为预定,本来我是打算自己暴力判断,不过我想来想去,放弃了~~

首相要想真正理解这道题,我们得分清楚HashMap和TreeMap的区别,为了分清它俩,我想了一晚上,今天早上起来看了别人的代码,自己改了一下,才真正理解到。

上代码!!

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class _732 {
	public static void main(String[] args) {
		Map<String, String> map = new HashMap<>();
        map.put("bob", "books");
        map.put("c", "concurrent");
        map.put("alkjjkhk", "a lock");
        System.out.println(map.keySet());
        Map<String, String> books = new TreeMap<>();
        books.put("bob", "books");
        books.put("casdaw", "concurrent");
        books.put("a", "a lock");
        System.out.println(books.keySet());
	}


}

HashMap:[c, bob, alkjjkhk]
TreeMap:[a, bob, casdaw]

 你会发现,明明按照字典:HashMap的c在b的后面,a在b的前面,为啥全乱了,

而TreeMap却没有收到影响,这就是TreeMap的key排序,会他的key按照自然排序

好了,理解了这玩意,解题就好说了;上代码!

class MyCalendarThree {
         TreeMap<Integer,Integer> map;
    public MyCalendarThree() {
         map=new TreeMap<Integer,Integer>();
    }
    
    public int book(int a, int b) {
        int cont=0;
        int max=0;
        map.put(a,map.getOrDefault(a,0)+1);
        map.put(b,map.getOrDefault(b,0)-1);
        for(int i:map.values()){
            cont+=i;
            max=Math.max(cont,max);
        }
    return max;
    }
}

来看看大佬是怎么解决的,我的理解:

1.把开始a和结束b全部存入map里面,下一次存入的时候进行判断,如果有这个k,就把这个k映射的v+1,没有的话赋值1

2.如果有这个b的k,我们就拿出映射的v-1,没有就赋值-1,

最后遍历所有的v相加,取最大值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值