代码随想录算法刷题训练营day13

代码随想录算法刷题训练营day13:LeetCode(239)滑动窗口最大值、LeetCode(347)前 K 个高频元素

LeetCode(239)滑动窗口最大值
题目
在这里插入图片描述
代码

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        myQueue myQueue1=new myQueue();
        //使用双端队列去做
        int len=nums.length;
        if(len==1){
            return nums;//返回这个数组,去除边角料的情况
        }
        int len1=len-k+1;//返回数组的长度
        int[] result=new int[len1];
        int numbers=0;
        //先把第一个滑动窗口的数据,把它扔进去
        for(int i=0;i<k;i++){
            myQueue1.mypush(nums[i]);
        }
        result[numbers++]=myQueue1.getMax();
        for(int j=k;j<nums.length;j++){
            int tempdata=nums[j-k];//先移-再加
            myQueue1.mypop(tempdata);
            myQueue1.mypush(nums[j]);
            result[numbers++]=myQueue1.getMax();    
        }
        return result;


    }
}
//首先得定义一个双端队列
class myQueue{
    public myQueue(){
        //定义一个双端队列
    }
    Deque<Integer> myDeque=new LinkedList<>();//队列
    //这个队列是由队列进行改编的
    
    /* 
     * 提供三个方法
     * 1、添加元素
     * 2、取最大元素
     * 3、删除元素
     */
    //1、添加元素
    public void mypush(int val){
        
        while(myDeque.isEmpty()==false&&val>myDeque.getLast()){
            myDeque.removeLast();//将最后一个元素移除,你需要连续移除,所以需要连续比较
        }
        myDeque.add(val);//push与add不一样,队列用add,栈用push
        }
    //2、弹出元素----根据元素值弹出元素
    public void mypop(int val){
        if(!myDeque.isEmpty()&&val==myDeque.peek()){
            myDeque.poll();
        }
    }
    //3、取最大值
    public int getMax(){
        return myDeque.peek();
    }

LeetCode(347)前 K 个高频元素
题目
在这里插入图片描述
代码

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



class Solution {
    public int[] topKFrequent(int[] nums, int k) {
       //定义一个Map数组,用于存储每个数字出现的次数
       Map<Integer,Integer> map=new HashMap<>();
       for(int i=0;i<nums.length;i++){
        if(map.containsKey(nums[i])){
            map.put(nums[i],map.get(nums[i])+1);
        }else{
            map.put(nums[i],1);
        }
       }
       //把数据存储完成之后,构建小顶椎,小顶椎每次弹出的元素是最小的,可以保留次数最大的
       PriorityQueue<int[]> small=new PriorityQueue<>((a,b)->a[1]-b[1]);//括号里面定义比较规则
       int number=0;//定义一个记录元素数量值
       Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
       for(Map.Entry<Integer, Integer> entry:entries){
        if(number<k){
            small.add(new int[]{entry.getKey(),entry.getValue()});
        }else{
            int[] tempdata=small.peek();
            if(entry.getValue()>tempdata[1]){
                small.poll();//把头顶干掉
                small.add(new int[]{entry.getKey(),entry.getValue()});
            }
        }
        number++;  
       }
       //此时堆里面仅有k个元素
       int[] result=new int[k];
       for(int i=k-1;i>=0;i--){
        result[i]=small.poll()[0];
       }
       return result;

    }
}
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值