2025-03-25:长度为 K 的子数组的能量值Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,你需要计算每个长度为 k 的子数组的能量值。
能量值的定义如下:
1.如果子数组中的元素是连续递增的(即 nums[i] + 1 = nums[i + 1] 对于所有有效的 i),那么能量值为该子数组中的最大元素。
2.如果不是连续递增,则能量值为 -1。
你的任务是返回一个长度为 n - k + 1 的数组 results,数组中的每个元素 results[i] 对应于子数组 nums[i..(i + k - 1)] 的能量值。
1 <= n == nums.length <= 100000。
1 <= nums[i] <= 1000000。
1 <= k <= n。
输入:nums = [1,2,3,4,3,2,5], k = 3。
输出:[3,4,-1,-1,-1]。
解释:
nums 中总共有 5 个长度为 3 的子数组:
[1, 2, 3] 中最大元素为 3 。
[2, 3, 4] 中最大元素为 4 。
[3, 4, 3] 中元素 不是 连续的。
[4, 3, 2] 中元素 不是 上升的。
[3, 2, 5] 中元素 不是 连续的。
题目来自leetcode3255。
resultsArray
函数中,将传入的整数数组 nums
和正整数 k
,以及数组的长度 n
分别存储起来。cnt
用于记录连续递增的元素个数,并初始化为 0。然后创建一个空数组 ans
,该数组长度为 n-k+1
,用于存储最后的结果。nums
,在循环中判断当前元素与前一个元素的关系,以确定能量值的类型。如果当前元素是数组的第一个元素,或者当前元素与前一个元素不相邻,则将计数器 cnt
设置为 1;否则递增计数器 cnt
。cnt
大于等于 k
,说明找到了一个长度为 k
的连续递增子数组,此时将该子数组的最大元素存储到结果数组 ans
中的相应位置。cnt
小于 k
,说明未达到要求的连续递增元素个数,这时需要判断当前子数组的起始位置是否在有效范围内(即超过了 k-1
个元素),如果在有效范围内则将该位置处的结果设为 -1。ans
。总的时间复杂度:
nums
:O(n),n 为数组的长度。总的额外空间复杂度:
n-k+1
的数组 ans
用于存储最后的结果,所以额外空间复杂度为 O(n-k+1) ≈ O(n)。package main
import (
"fmt"
)
func resultsArray(nums []int, k int) []int {
n := len(nums)
cnt := 0
ans := make([]int, n-k+1)
for i := 0; i < n; i++ {
if i == 0 || nums[i]-nums[i-1] != 1 {
cnt = 1
} else {
cnt++
}
if cnt >= k {
ans[i-k+1] = nums[i]
} else if i-k+1 >= 0 {
ans[i-k+1] = -1
}
}
return ans
}
func main() {
nums := []int{1, 2, 3, 4, 3, 2, 5}
k := 3
result := resultsArray(nums, k)
fmt.Println(result)
}
# -*-coding:utf-8-*-
def results_array(nums, k):
n = len(nums)
cnt = 0
ans = [-1] * (n - k + 1)
for i in range(n):
if i == 0 or nums[i] - nums[i - 1] != 1:
cnt = 1
else:
cnt += 1
if cnt >= k:
ans[i - k + 1] = nums[i]
elif i - k + 1 >= 0:
ans[i - k + 1] = -1
return ans
if __name__ == "__main__":
nums = [1, 2, 3, 4, 3, 2, 5]
k = 3
result = results_array(nums, k)
print(result)
·
我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。