首页 > 其他分享 >Leetcode刷题day11-栈.滑窗最大值.出现次数前K的元素

Leetcode刷题day11-栈.滑窗最大值.出现次数前K的元素

时间:2023-12-11 23:33:48浏览次数:30  
标签:窗口 滑窗 nums 最大值 元素 list day11 滑动 Leetcode

239.滑动窗口最大值

239. 滑动窗口最大值 - 力扣(LeetCode)
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

  • 示例 1:
    • 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
    • 输出:[3,3,5,5,6,7]
    • 解释:
    • 滑动窗口的位置 最大值
      [1 3 -1] -3 5 3 6 7 3
      1 [3 -1 -3] 5 3 6 7 3
      1 3 [-1 -3 5] 3 6 7 5
      1 3 -1 [-3 5 3] 6 7 5
      1 3 -1 -3 [5 3 6] 7 6
      1 3 -1 -3 5 [3 6 7] 7
  • 示例 2:
    • 输入:nums = [1], k = 1
    • 输出:[1]

解题思路
单调队列:先形成窗口,若队列尾部元素<当前元素,则剔除尾部元素;再从k处遍历列表,若队列头部元素==窗口第一个元素,则剔除队列头部元素;再判断队列尾部元素<当前元素,剔除尾部元素;最后,将当前元素添加到队列,并将队列头部元素添加至result中

from collections import deque
class Solution():
	def maxSlidingWindow(self,nums,k):
		if not nums or not k or len(nums)<k: return []
		queue = deque()
		for i in range(k):
			while queue and queue[-1]<nums[i]:
				queue.pop()
			queue.append(nums[i])
		result = [queue[0]]
		for j in range(k,len(nums)):
			if queue[0]==nums[j-k]:
				queue.popleft()
			while queue and queue[-1]<nums[j]:
				queue.pop()
			queue.append(nums[j])
			result.append(queue[0])
		return result

347.前K个高频元素

347. 前 K 个高频元素 - 力扣(LeetCode)
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

  • 示例 1:
    • 输入: nums = [1,1,1,2,2,3], k = 2
    • 输出: [1,2]
  • 示例 2:
    • 输入: nums = [1], k = 1
    • 输出: [1]

解题思路
hashmap:先用dict存储nums中的元素及出现次数,将dict转化成二维list,再对二维list按出现次数排序(sorted+lambda),取前k个list,最后取出前k个元素并组装

class Solution:
	def topKFrequent(self,nums,k):
		dic = {}
		for i in nums:
			dic[i] = dic.get(i,0)+1
		th_list = [[k,v] for k,v in dic.items()]
		th_list_sort = sorted(th_list,key=lambda x:x[1],reverse=True)
		result = [th_list_sort[i][0] for i in range(k)] 
		return result

标签:窗口,滑窗,nums,最大值,元素,list,day11,滑动,Leetcode
From: https://www.cnblogs.com/lzj2023/p/17895866.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:两整数之和
    题目给你两个整数a和b,不使用运算符+和-,计算并返回两整数之和。 示例1:输入:a=1,b=2输出:3示例2:输入:a=2,b=3输出:5代码实现classSolution{publicintgetSum(inta,intb){while(b!=0){intcarry=(a&b)<<1;......
  • [LeetCode Hot 100] LeetCode24. 两两交换链表中的节点
    题目描述思路:创建dummy节点,令dummy.next=head。令cur表示当前到达的节点,初始时cur=dummy。每次需要交换cur后面的两个节点。如果cur的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得cur后面的两个节点node1和node2,通过更新节点的指针关系......
  • [LeetCode Hot 100] LeetCode148. 排序链表
    题目描述思路一:堆排序、小顶堆定义一个最小堆将链表的所有节点放入一个最小堆中直接用队列弹出的最小值依次覆盖掉原链表的值方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • [LeetCode Hot 100] LeetCode138. 随机链表的复制
    题目描述思路一:添加"小弟"根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面。原节点i的随机指针(如果有的话),指向的是原节点j,那么新节点i的随机指针,指向的是原节点j的next最后将两个链表分开,再返回新链表就可以思路二:使用哈希表首先创建一个哈希表......
  • [LeetCode Hot 100] LeetCode25. K个一组翻转链表
    题目描述思路:判断链表中是否足够k个元素再将这k个元素内部翻转一下将前后端点连接的指针变化一下方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval)......
  • LeetCode-总入口
    LeetCode刷题整理LeetCode-1-二叉树LeetCode-2-动态规划LeetCode-3-二分查找LeetCode-4-BFS/DFS/回溯LeetCode-5-双指针LeetCode-10-位操作10大排序算法+topK链表操作2021秋招-数据结构-栈、队列、数组、列表2021秋招-算法-滑动窗口算法框架......
  • [ LeetCode ] 67. Add Binary
    题目Giventwobinarystringsaandb,returntheirsumasabinarystring.思考题外话:根据LeetCodepremium的说法,这题是no.4最常被Facebook面试问到的题目这题是二进制相加的问题什么是二进制二进制是一种计数系统,基于数字0和1。与十进制每10进1不同,二进制每2进1二......
  • [LeetCode Hot 100] LeetCode155. 最小栈
    题目描述思路一:使用辅助栈定义一个[数据栈]来支持push、pop、top操作定义一个[辅助栈],其栈顶为当前的最小值,以支持常数时间复杂度的getMin操作思路二:使用ArrayDeque栈元素中除了保存当前值之外,额外保存当前最小值使用静态内部类方法一:对应思路一classMinStack{......
  • day11栈与队列
    day11栈与队列20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值1有效的括号给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被......
  • Leetcode刷题day9-栈.队列-栈转队列.队列转栈
    232.用栈实现队列232.用栈实现队列-力扣(LeetCode)请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:voidpush(intx) 将元素x推到队列的末尾intpop() 从队列的开头移除并返回元素intpeek() 返回队......