首页 > 其他分享 >LeetCode Day13 239&347

LeetCode Day13 239&347

时间:2023-10-24 12:00:28浏览次数:39  
标签:deque nums int -- map 347 239 new LeetCode

//利用双端队列手动实现单调队列
/**
* 用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可
* 单调队列类似 (tail -->) 3 --> 2 --> 1 --> 0 (--> head) (右边为头结点,元素存的是下标)
*/

239. 滑动窗口最大值

class Solution {
    public 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 ++){
            while(!deque.isEmpty() && deque.peek() < i - k + 1){
                deque.poll();
            }

            while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]){
                deque.pollLast();
            }

            deque.offer(i);

            if(i >= k - 1){
                res[idx ++] = nums[deque.peek()];
            }
        }

        return res;
    }
}
View Code

 

347. 前 K 个高频元素

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int num : nums){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){//大顶堆需要对所有元素进行排序
            pq.add(new int[]{entry.getKey(),entry.getValue()});
        }
        int[] ans = new int[k];
        for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素
            ans[i] = pq.poll()[0];
        }
        return ans;
    }
}
View Code

 

标签:deque,nums,int,--,map,347,239,new,LeetCode
From: https://www.cnblogs.com/LinawZ/p/17784486.html

相关文章

  • LeetCode 454.四数相加 II
    题目描述给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0描述第一次提交的代码importjava.util.Map;importjava.util.HashMap;classSol......
  • [Leetcode Weekly Contest]368
    链接:LeetCode[Leetcode]2908.元素和最小的山形三元组I给你一个下标从0开始的整数数组nums。如果下标三元组(i,j,k)满足下述全部条件,则认为它是一个山形三元组:i<j<knums[i]<nums[j]且nums[k]<nums[j]请你找出nums中元素和最小的山形三元组,并返回......
  • 【LeetCode】LCP 06.拿硬币
    描述桌上有n堆力扣币,每堆的数量保存在数组coins中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。示例输入:[4,2,1]输出:4解释:第一堆力扣币最少需要拿2次,第二堆最少需要拿1次,第三堆最少需要拿1次,总共4次即可拿完。限制1<=n<=41<=co......
  • LeetCode | 19. 删除链表的倒数第 N 个结点
    1相关标签链表、双指针、C语言2报错情况2.1题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。2.2错误代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNo......
  • 代码随想训练营第十三天(Pyhton)| 239. 滑动窗口最大值、347.前 K 个高频元素
    239.滑动窗口最大值classSolution:defmaxSlidingWindow(self,nums:List[int],k:int)->List[int]:res=[]tmp=MyQueue()foriinrange(k):tmp.push(nums[i])res.append(tmp.front())fo......
  • LeetCode 1.两数之和
    题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例第一次提交的代码i......
  • [Leetcode] 0088. 合并两个有序数组
    88.合并两个有序数组题目描述给你两个按非递减顺序排列的整数数组 nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1......
  • [Leetcode] 0824. 山羊拉丁文
    824.山羊拉丁文题目描述给你一个由若干单词组成的句子 sentence,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。请你将句子转换为“山羊拉丁文(GoatLatin)”(一种类似于猪拉丁文 -PigLatin的虚构语言)。山羊拉丁文的规则如下:如果单词以元音开头('a','e','i',......
  • [Leetcode] 0821. 字符的最短距离
    821.字符的最短距离题目描述给你一个字符串s和一个字符c,且c是s中出现过的字符。返回一个整数数组answer,其中answer.length==s.length且answer[i]是s中从下标i到离它最近的字符c的距离。两个下标 i和j之间的距离为abs(i-j),其中abs是绝......
  • LeetCode 300. 最长递增子序列
    最长递增子序列题目链接:300.最长递增子序列题目描述:给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,......