239. 滑动窗口最大值
背景:给一个nums数组,一个长度k,求挪动滑动窗口区间里最大值
思路:
- 思路1:直接求区间最大值,每次挪动区间步长为k,每次直接比较最大值添加至结果,but ,可能太暴力,超时啦
- 思路2:大体思路为要求滑动窗口区间里元素的最大值,则统计遍历过的窗口元素并通过队列从大到小排序(为什么用队列不用栈?因为比较的是最左侧元素,用队列更方便实现最左边是最大值),每新增一个元素,则去掉一个窗口外的元素,去掉时怎么判断新的窗口最大元素呢?因为已经记录上一个窗口数值情况并从大到小排序,每次比较当前元素和队列左侧的大小,如果比队列左侧大,则更新队列元素即加入新元素;这里面有一个难题,一旦根据大小排序了,那么比较时候怎么确定最大值的位置呢,所以使用enumerate函数,给出num时候给出坐标,然后队列中也存放最大值对应的坐标,这样只要依次判断,如果当前元素位置和最大值即(队列左端位置)范围在区间内,则直接统计最大值;若是超出区间范围则需要递减往下取最大值。
实践:
复盘:deq[-1]==(队列右侧元素),deq[0]==(队列左侧元素),deq.pop()==(从队列右侧删除元素),deq.popleft()==(从队列左侧删除元素)
i>=k-1即从第1个区间开始统计
347.前 K 个高频元素
背景:给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
思路:
思路1:统计数组所有数出现频次,按照频率次数倒叙,输出前k个
思路2:排序思路暂时没看懂,再研究研究
实践:
复盘:字典排序可以使用sorted(dic.items(),key=lambda x:x[1],reverse=True) 最后取列表中第一个值,则可以用列表生成式【item[0] for item in dic】