「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
题目
解题思路
找出数组排序后的目标下标
排序后枚举数组中数据,返回数组与target相等的下标即可;
简单问题简单解决
时间复杂度(nlogn)
var targetIndices = function(nums, target) {
nums.sort((a,b)=>a-b);
const result = [];
for(let i = 0 ; i < nums.length ; i++){
if(nums[i] === target){
result.push(i)
}
}
return result
};
半径为 k 的子数组平均值
滑动窗口
看图看图
var getAverages = function (nums, k) {
//获取长度
const len = nums.length
//长度不够直接返回
if (2 * len + 1 < k) return Array(len).fill(-1)
// 因为结果只能是-1和计算后的平均数,所以直接将结果数组全部赋值为-1
const result = Array(len).fill(-1)
let t = 0
//计算小于K前缀和
for (let i = 0; i < k; i++) {
t = t + nums[i] + nums[k + i]
}
// 大于k小于len-k的这段是需要计算平均数的
for (let i = k; i < len - k; i++) {
// 计算前缀和
t += nums[i + k]
// 求平均数
const n = Math.floor(t / (2 * k + 1))
result[i] = n
// 将头部的数减去
t -= nums[i - k]
}
return result
}
从数组中移除最大值和最小值
边界问题:
第1步:获取数组中最大值与最小值下标;
第2步:计算从左侧删除最大值需要步数
第3步:计算从右侧删除最大值需要步数
第4步:计算从左侧删除最小值需要步数
第5步:计算从右侧删除最小值需要步数
第6步:计算四种组合
第7步:取4种删除方式最小步数
var minimumDeletions = function (nums) {
const min = Math.min(...nums)
const max = Math.max(...nums)
const maxRight = nums.indexOf(max) + 1
const minRight = nums.indexOf(min) + 1
const len = nums.length
const maxLeft = len - maxRight + 1
const minLeft = len - minRight + 1
const t1 = Math.max(maxRight, minRight)
const t2 = maxRight + minLeft
const t3 = Math.max(maxLeft, minLeft)
const t4 = maxLeft + minRight
return Math.min(t1, t2, t3, t4)
}