一、239.滑动窗口最大值
题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
链接:https://leetcode.cn/problems/sliding-window-maximum
代码:
var maxSlidingWindow = function(nums, k) {
const n = nums.length;
const q = [];
for (let i = 0; i < k; i++) {
while (q.length && nums[i] >= nums[q[q.length - 1]]) {
q.pop();
}
q.push(i);
}
const ans = [nums[q[0]]];
for (let i = k; i < n; i++) {
while (q.length && nums[i] >= nums[q[q.length - 1]]) {
q.pop();
}
q.push(i);
while (q[0] <= i - k) {
q.shift();
}
ans.push(nums[q[0]]);
}
return ans;
};
二、 347.前K个高频元素
题目:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
代码:
var topKFrequent = function(nums, k) {
//前k个高频元素
let hash = new Map();
//频率统计
for(let i of nums){
if(!hash.has(i)) hash.set(i,1);
else hash.set(i,hash.get(i)+1);
}
nums=new Array(hash.size);
let j=0;
for(let [key,value] of hash){
nums[j++]=[key,value];
}
getK(nums,0,nums.length-1,k);
let res=new Array(k);
for(let i=0;i<k;++i){
res[i] = nums[i][0];
}
return res;
};
//分治
var getK = function(nums,left,right,k){
if(left>=right) return ;
let temp = quikSort(nums,left,right,k);
if(temp+1==k+left) return ;
else if(temp+1<k+left){
getK(nums,temp+1,right,k-(temp+1-left)); //前面的temp+1-left已经符合要求 找剩下的k-(temp+1-left)个最大元素
} else getK(nums,left,temp-1,k); //继续找前k个最大元素
return ;
}
var quikSort = function(nums,left,right){
if(left>=right) return left;
let pivot = nums[left];
let i=left,j=right;
while(i<j){
while(nums[j][1]<pivot[1] && i<j) --j;
nums[i] = nums[j];
while(nums[i][1]>=pivot[1] && i<j) ++i;
nums[j] = nums[i];
if(i==j) nums[i] = pivot;
}
return i;
}