第 269 场周赛
No.1 找出数组排序后的目标下标
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 的子数组平均值
思路:
- 先排除无解的情况。(无解的情况返回是
k个元素均为-1的数组) - 滚动数组求每个位置的平均值
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. 从数组中移除最大值和最小值
技巧:
- 找最大最小值的下标,找到后为了方便计算,将
r调整为大下标,l调整为小下标。 - 最小删除次数计算,下面三种情况取最小值:
l从左侧,r从右侧移除,此时删除次数为,l+1+(len(nums)-r)- 两者都从左侧删除,此时删除次数
r + 1。(因为r > l,删除r的同时,顺道将l删除了,删除l的次数可以不记) - 两者都从右侧删除,此时删除次数
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 找出知晓秘密的所有专家