2025-03-24:长度为 K 的子数组的能量值Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,我
2025-03-24:长度为 K 的子数组的能量值Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,我们需要定义数组的能量值:
1.如果数组中的所有元素都连续且严格递增,则能量值等于该子数组中的最大元素。
2.如果不满足上述条件,则能量值为 -1。
我们的任务是计算 nums 中每个长度为 k 的子数组的能量值。最后,我们需要返回一个长度为 n - k + 1 的结果数组,其中 results[i] 表示子数组 nums[i] 到 nums[i + k - 1] 的能量值。
1 <= n == nums.length <= 500。
1 <= nums[i] <= 100000。
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] 中元素 不是 连续的。
题目来自leetcode3254。
大体步骤如下:
1.定义一个函数 resultsArray(nums []int, k int) []int
来计算能量值,参数为整数数组 nums
和正整数 k
。
2.初始化变量 n
为数组 nums
的长度,即元素个数。初始化计数器 cnt
为 0。
3.创建一个用于存放结果的数组 ans
,长度为 n - k + 1
,初始化值为 0。
4.遍历数组 nums
,对于每个元素进行以下操作:
-
如果当前元素是第一个元素或者当前元素与前一个元素不连续,则将计数器
cnt
置为 1。 -
否则,递增计数器
cnt
。 -
如果计数器
cnt
大于等于 k,则将当前元素放入对应的结果数组中。 -
否则,如果当前元素不符合条件,且子数组长度足够放入能量值,则在结果数组中放入 -1。
5.返回结果数组 ans
。
6.在 main
函数中准备一个整数数组 nums
和整数 k
,并调用 resultsArray
函数计算能量值,最后打印结果数组。
总的时间复杂度分析:
-
遍历整个数组
nums
需要 O(n) 的时间复杂度。 -
在遍历过程中,对于每个元素的处理是常数时间的操作,因此不会影响总的时间复杂度。
-
因此,总的时间复杂度为 O(n)。
总的额外空间复杂度分析:
- 需要额外的存储空间来存放结果数组
ans
,其长度为n - k + 1
,因此额外空间复杂度为 O(n)。
综上所述,该算法的总的时间复杂度为 O(n),总的额外空间复杂度为 O(n)。
Go完整代码如下:
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)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def results_array(nums, k):
n = len(nums)
cnt = 0
ans = [-1] * (n - k + 1) # 初始化结果数组为 -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)
- 点赞
- 收藏
- 关注作者
评论(0)