【英雄算法六月集训】Day21
732. 我的日程安排表 III
差分的思想 差分就是一侧++ 一侧–
特征 :
差分思想
有序集合
TreeMap
class MyCalendarThree {
private TreeMap<Integer, Integer> cnt;
public MyCalendarThree() {
cnt = new TreeMap<Integer, Integer>();
}
public int book(int start, int end) {
int ans = 0;
int maxBook = 0;
cnt.put(start, cnt.getOrDefault(start, 0) + 1);
cnt.put(end, cnt.getOrDefault(end, 0) - 1);
for (Map.Entry<Integer, Integer> entry : cnt.entrySet()) {
int freq = entry.getValue();
maxBook += freq;
ans = Math.max(maxBook, ans);
}
return ans;
}
}
/**
* Your MyCalendarThree object will be instantiated and called as such:
* MyCalendarThree obj = new MyCalendarThree();
* int param_1 = obj.book(start,end);
*/
class FreqStack {
Map<Integer,Integer> freq;
Map<Integer,Stack<Integer>> frep2Stk;
int maxfreq=0;
public FreqStack() {
freq= new HashMap<Integer,Integer>();
frep2Stk = new HashMap<Integer,Stack<Integer>>();
}
public void push(int val) {
freq.put(val,freq.getOrDefault(val,0)+1);
if(freq.get(val) > maxfreq){
maxfreq = freq.get(val);
}
if(frep2Stk.get(freq.get(val)) == null){
frep2Stk.put(freq.get(val),new Stack<Integer>());
}
frep2Stk.get(freq.get(val)).push(val);
}
public int pop() {
int val = frep2Stk.get(maxfreq).pop();
freq.put(val,freq.getOrDefault(val,0)-1);
if(frep2Stk.get(maxfreq).size()==0){
maxfreq--;
}
return val;
}
}
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack obj = new FreqStack();
* obj.push(val);
* int param_2 = obj.pop();
*/
895. 最大频率栈
class FreqStack {
Map<Integer,Integer> freq;
Map<Integer,Stack<Integer>> frep2Stk;
int maxfreq=0;
public FreqStack() {
freq= new HashMap<Integer,Integer>();
frep2Stk = new HashMap<Integer,Stack<Integer>>();
}
public void push(int val) {
freq.put(val,freq.getOrDefault(val,0)+1);
if(freq.get(val) > maxfreq){
maxfreq = freq.get(val);
}
if(frep2Stk.get(freq.get(val)) == null){
frep2Stk.put(freq.get(val),new Stack<Integer>());
}
frep2Stk.get(freq.get(val)).push(val);
}
public int pop() {
int val = frep2Stk.get(maxfreq).pop();
freq.put(val,freq.getOrDefault(val,0)-1);
if(frep2Stk.get(maxfreq).size()==0){
maxfreq--;
}
return val;
}
}
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack obj = new FreqStack();
* obj.push(val);
* int param_2 = obj.pop();
*/
352. 将数据流变为多个不相交区间
偏序关系的了解
class SummaryRanges {
TreeSet<int[]> ts = new TreeSet<>((a,b)->a[0]-b[0]);
int[] head = new int[]{-10,-10},tail = new int[]{10010,10010};
public SummaryRanges() {
ts.add(head);
ts.add(tail);
}
public void addNum(int val) {
int[] cur = new int[]{val,val};
int[] prev = ts.floor(cur);
int[] next = ts.ceiling(cur);
if(prev[0] <=val&&val<=prev[1] ||(next[0]<=val&&val<=next[1])){
//nothing to do
}else if(prev[1]+1 == val && next[0]-1 == val){
prev[1] = next[1];
ts.remove(next);
}else if(prev[1]+1 == val){
prev[1] = val;
}else if(next[0]-1 == val){
next[0] = val;
}else{
ts.add(cur);
}
}
public int[][] getIntervals() {
int n = ts.size();
int[][] ans = new int[n-2][2];
Iterator<int[]> iterator = ts.iterator();
iterator.next();
for(int i=0;i<n-2;++i){
ans[i] = iterator.next();
}
return ans;
}
}
/**
* Your SummaryRanges object will be instantiated and called as such:
* SummaryRanges obj = new SummaryRanges();
* obj.addNum(val);
* int[][] param_2 = obj.getIntervals();
*/