[路飞]_Leetcode第 269 场周赛

235 阅读2分钟

「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

题目

5938. 找出数组排序后的目标下标

5939. 半径为 k 的子数组平均值

5940. 从数组中移除最大值和最小值

解题思路

找出数组排序后的目标下标

排序后枚举数组中数据,返回数组与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 的子数组平均值

滑动窗口

看图看图

未命名.001.jpeg

未命名.002.jpeg

未命名.003.jpeg

未命名.004.jpeg

未命名.005.jpeg

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)
}