第 269 场周赛

146 阅读1分钟

第 269 场周赛

image.png

  1. 排名

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

5939.png

func targetIndices(nums []int, target int) []int {
	result := []int{}
	sort.Ints(nums)
	for i:=0;i<len(nums);i++{
		if nums[i]==target{
			result = append(result, i)
		}
	}
	return result
}

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

5939.png

思路:

  1. 先排除无解的情况。(无解的情况返回是k个元素均为-1的数组)
  2. 滚动数组求每个位置的平均值

solve.1

func getAverages(nums []int, k int) []int {
   r := 2*k + 1
   result := []int{}
   if len(nums)<r{
      for i:=0;i<len(nums);i++ {
         result = append(result, -1)
      }
      return result
   }

   sum := 0
   for i := 0; i < k; i++ {
      result = append(result, -1)
   }

   for i := 0; i < r; i++ {
      sum += nums[i]
   }

   for i := k; i < len(nums)-k; i++ {
      result = append(result, sum/(r))
      sum -= nums[i-k]
      i++
      if (k+i)<len(nums){
         sum += nums[k+i]
      }
   }

   for i := len(nums) - k; i < len(nums); i++ {
      result = append(result, -1)
   }
   return result
}

solve.2

func getAverages(nums []int, k int) []int {
    if k == 0 {
        return nums
    }
    ans := make([]int, len(nums))
    presum := make([]int, len(nums)+1)
    for i, v := range nums {
        presum[i+1] = presum[i] + v
    }
    for i := range ans {
        if i - k >= 0 && i + k < len(nums) {
            ans[i] = (presum[i+k+1] - presum[i-k]) / (2 * k + 1);
        } else {
            ans[i] = -1
        }
    }
    return ans
}

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

5940.png

技巧:

  1. 找最大最小值的下标,找到后为了方便计算,将r调整为大下标,l调整为小下标。
  2. 最小删除次数计算,下面三种情况取最小值:
    1. l从左侧,r从右侧移除,此时删除次数为,l+1+(len(nums)-r)
    2. 两者都从左侧删除,此时删除次数r + 1。(因为r > l,删除r的同时,顺道将l删除了,删除l的次数可以不记)
    3. 两者都从右侧删除,此时删除次数len(nums) - l。原理同2
func minimumDeletions(nums []int) int {
	maxVal, minVal := -100001, 100001
	r, l := -1, -1
	for i := 0; i < len(nums); i++ {
		if maxVal < nums[i] {
			maxVal = nums[i]
			r = i
		}
		if minVal > nums[i] {
			minVal = nums[i]
			l = i
		}
	}
	if r<l{
		l,r=r,l
	}
	return min(min(len(nums)-(r-l-1),r+1),len(nums)-l)
}
func min(v1, v2 int) int {
	if v1 > v2 {
		return v2
	} else {
		return v1
	}
}

No.4 找出知晓秘密的所有专家

5939.png