首页 > 其他分享 >day12

day12

时间:2023-01-27 01:55:19浏览次数:43  
标签:deque int 元素 队列 day12 小顶 new

1、leetcode239 滑动窗口最大值

  1. 思路:

    1. 使用一个队列,将窗口里的元素放入队列,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。
      1. 队列所需操作:pop、push、getMaxValue
    2. 这个队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的
      1. 维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。
    3. 设计
      1. 在出口处(队首)维护最大值
        1. pop(value):如果窗口移除的元素value等于单调队列的出口元素(队首),那么队列弹出元素,否则不用任何操作【确保移除元素是最大值】
        2. push(value):如果push的元素value大于入口元素(队尾)的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止【确保队列元素是单调排列】
        3. getMaxValue():出口处元素即为当前窗口最大值
  2. 代码实现

    class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            MyQueue que = new MyQueue();
            int[] res = new int[nums.length-k+1];
            int index = 0;
    
            for(int i=0; i<k; i++){ // 先将前k的元素放进队列
                que.push(nums[i]);
            }
            res[index++] = que.getMaxValue();// result 记录前k的元素的最大值
    
            for(int i=k; i<nums.length; i++){
                que.pop(nums[i-k]); // 滑动窗口移除最前面元素
                que.push(nums[i]); // 滑动窗口前加入最后面的元素
                res[index++] = que.getMaxValue(); // 记录对应的最大值
            }
    
            return res;
        }
        
    }
    
    class MyQueue { 
        Deque<Integer> deque  = new LinkedList<Integer>();
        
        void pop(int val){
            if(!deque.isEmpty() && val==deque.peek()){
                deque.poll();
            }
        }
    
        void push(int val){
            while(!deque.isEmpty() && val > deque.peekLast()){
                deque.pollLast();
            }
            deque.offer(val);
        }
    
        int getMaxValue(){
            return deque.peek();
        }
    }
    

2、leetcode347 前k个高频元素

  1. 思路

    1. 遍历数组,用map存储数组元素(key)以及其出现频次(value)
      1. 遍历map,用小顶堆统计最大的前k个元素
        1. 只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。
  2. 代码实现

    class Solution {
        public int[] topKFrequent(int[] nums, int k) {
            Map<Integer, Integer> map = new HashMap<>(); //key为数组元素,value为出现频次
            for(int num : nums){
                map.put(num,map.getOrDefault(num,0)+1);
            }
            //在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数
            //出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆)
            PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);
            for(Map.Entry<Integer,Integer> entry:map.entrySet()){//小顶堆只需要维持k个元素有序
                if(pq.size()<k){//小顶堆元素个数小于k个时直接加
                    pq.add(new int[]{entry.getKey(),entry.getValue()});
                }else{
                    if(entry.getValue()>pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个)
                        pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了
                        pq.add(new int[]{entry.getKey(),entry.getValue()});
                    }
                }
            }
            int[] ans = new int[k];
            for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多
                ans[i] = pq.poll()[0];
            }
    
            return ans;
    
        }
    }
    

标签:deque,int,元素,队列,day12,小顶,new
From: https://www.cnblogs.com/hzj-bolg/p/17068466.html

相关文章

  • C++Day12 虚拟继承内存布局测试
    测试一、虚继承与继承的区别1.1单个继承,不带虚函数1>classBsize(8):1>+---1>0|+---(baseclassA)1>0||_ia//4B1......
  • 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素
    基础知识ArrayDequedeque=newArrayDeque();/*offerFirst(Ee)在数组前面添加元素,并返回是否添加成功offerLast(Ee)在数组后天添加元素,并返回是否添加成功po......
  • Day12 - 多任务编程【进程】
    0.多任务的概念多任务是指在同一时间内执行多个任务,例如:现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。1.多任务介绍多任务为提高程序的执行效......
  • day12-继承
    1.继承1.1继承的实现(掌握)继承的概念继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法实现继承的格式......
  • day12-功能实现11
    家居网购项目实现011以下皆为部分代码,详见https://github.com/liyuelian/furniture_mall.git27.功能25-事务管理27.1下订单问题思考在生成订单的功能中,系统会去同时......
  • day12
    ......
  • day12_内部类&API
    1、参数传递1.1类名作为形参和返回值类名——方法形参    方法的形参是类名,需要的是该类的对象;实际传递的是该对象的地址值类名——返回值    方法的返......
  • 剑指offer——Day12 双指针(简单)
    Day122022.11.18双指针(简单)25.合并两个排序的链表自己实现就用两个指针分开指向两个链表并进行遍历,比较之后放入新的列表里。代码如下:classSolution{public:......
  • 百题_每日一题Day12
    将列表转换为字典。key=['laoda','laoer','laosan']value=['ha','haha','hahaha']di={}foriinrange(len(key)):di[key[i]]=value[i]--通过键值对形式赋值。......
  • 排序函数的算法(day12)
    今天尝试了三种数字的排序法。目的为1)熟悉数组的操作2)熟悉循环笔者是做嵌入式的,不想再算法上做过多探究,自身水平和专业也不允许深入太多。现在直接给出三种排序函数。1.插值......