首页 > 编程语言 >算法学习day13栈与队列part03-239、347

算法学习day13栈与队列part03-239、347

时间:2023-05-10 22:56:31浏览次数:41  
标签:deque pq nums int part03 次数 347 239 new

package LeetCode.StackAndQueuepart03;

import java.util.ArrayDeque;

/**
 * 239. 滑动窗口最大值
 * 给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。
 * 你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。
 * 返回 滑动窗口中的最大值 。
 * 示例:
 * 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
 * 输出:[3,3,5,5,6,7]
 * */
public class SlidingWindowMaximum_239 {
    public static void main(String[] args) {
        int [] nums = {1,3,-1,-3,5,3,6,7};
        int k = 3;
        int [] result = maxSlidingWindow(nums,k);
        for (int i = 0; i < result.length; i++) {
            System.out.print(result[i]+"  ");
        }

    }

    public static int[] maxSlidingWindow(int[] nums, int k) {
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        int n = nums.length;
        int[] res = new int[n - k + 1];
        int idx = 0;
        for(int i = 0; i < n; i++) {
            // 根据题意,i为nums下标,是要在[i - k + 1, i] 中选到最大值,只需要保证两点
            // 1.队列头结点需要在[i - k + 1, i]范围内,不符合则要弹出
            while(!deque.isEmpty() && deque.peek() < i - k + 1){
                deque.poll();
            }
            // 2.既然是单调,就要保证每次放进去的数字要比末尾的都大,否则也弹出
            while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }

            deque.offer(i);

            // 因为单调,当i增长到符合第一个k范围的时候,每滑动一步都将队列头节点放入结果就行了
            if(i >= k - 1){
                res[idx++] = nums[deque.peek()];
            }
        }
        return res;
    }
}
package LeetCode.StackAndQueuepart03;

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

/**
 * 347. 前 K 个高频元素
 * 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
 * 示例:
 * 输入: nums = [1,1,1,2,2,3], k = 2
 * 输出: [1,2]
 * */
public class TopKFrequentElements_347 {
    public static int[] topKFrequent2(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
        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,pq,nums,int,part03,次数,347,239,new
From: https://www.cnblogs.com/lipinbigdata/p/17389589.html

相关文章

  • CVE-2021-27239 漏洞复现
    在此感谢tolele师傅的帮助参考链接https://toleleyjl.github.io/2023/04/09/CVE-2021-27239%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%E8%AE%B0%E5%BD%95/https://toleleyjl.github.io/2023/02/16/CVE-2021-34991%E5%A4%8D%E7%8E%B0/https://xuanxuanblingbling.github.io/io......
  • 力扣---2390. 从字符串中移除星号
    给你一个包含若干星号*的字符串s。在一步操作中,你可以:选中s中的一个星号。移除星号左侧最近的那个非星号字符,并移除该星号自身。返回移除所有星号之后的字符串。注意:生成的输入保证总是可以执行题面中描述的操作。可以证明结果字符串是唯一的。 示例1:输入:s=......
  • 347. 前 K 个高频元素
    347.前K个高频元素publicclasstopK{////第一种方法,需要对所有的数据进行排序时间复杂度n*logn//publicstaticint[]topKFrequent(int[]nums,intk){//HashMap<Integer,Integer>hashMap=newHashMap<>();////for(inti=0;i<nums.......
  • COMP2396 可视化卡游戏编程
    COMP2396Object-orientedprogrammingandJavaAssignment3:GUICardGameDuedate:21stApril2023(Friday),23:59ThisassignmenttestsyourunderstandingofGUIprogramminginJavaandyourprogrammingskillsYoushoulddeveloptheprogramusingEclipsean......
  • 发布三个月跳水超1000!苹果M2版Mac mini降到3478元了
    快科技4月18日消息,苹果在今年1月17日晚,在官网上架了新款的Macmini,搭载了M2芯片,起售价4499元。当时该产品配合上教育优惠,一度被认为是“香爆了”的产品,如今距离发布刚好三个月时间,其价格在电商平台却直接跳水千元。根据拼多多百亿补贴频道显示,苹果M2版Macmini如今售价只要3478......
  • 239. 滑动窗口最大值
    设计单调栈classSolution{classMyQueue{Deque<Integer>deque=newLinkedList<>();//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出publicvoidpoll(intval){if(!deque.isEmpty()&&val==deque.pee......
  • [LeetCode] 2390. Removing Stars From a String
    Youaregivenastring s,whichcontainsstars *.Inoneoperation,youcan:Chooseastarin s.Removetheclosest non-star charactertoits left,aswellasremovethestaritself.Return thestringafter all starshavebeenremoved.Note:Thei......
  • 【LeeCode】2399. 检查相同字母间的距离
    【题目描述】给你一个下标从 0 开始的字符串 s ,该字符串仅由小写英文字母组成,s 中的每个字母都 恰好 出现 两次 。另给你一个下标从 0 开始、长度为 26 的的整数数组 distance 。字母表中的每个字母按从 0 到 25 依次编号(即,'a'->0, 'b'->1, 'c'->2,.........
  • 旅行 Tour uva1347
    直角坐标系中,有nn个点。要求先从左往右走,再从右往左走,不重复的经过每一个点。求出最短路径(距离为两点间直线距离)。 f[i][j]表示点1~max(i,j)已走过,的路径长度 #include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<iomanip>......
  • 洛谷 P2398. GCD SUM
    题目描述求$$\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)$$输入:2输出:5算法1 线性筛 $O(n)$将式子变形:要知道一个前置定理$\sum\limits_{d|n}\varphi(d)=n$艾弗森约定:定义$\\\[P]$=$$\begin{cases}P\text{}is\text{}tr......