提示:关于数组子问题的挑战,涉及能量值的计算。
文章目录
一、问题描述
给定一个长度为 n 的整数数组 nums 和一个正整数 k,我们需要计算每个长度为 k 的子数组的能量值。能量值的定义如下:
如果子数组的所有元素都是依次连续且上升的,那么该子数组的能量值就是其最大元素。否则,能量值为 -1。
输入格式:
nums: 一个包含 n 个整数的列表。
k: 一个正整数,表示每个子数组的长度。
输出格式:
返回一个长度为 n - k + 1 的整数数组,包含每个子数组的能量值。
示例
示例一:
输入:nums = [1,2,3,4,3,2,5], k = 3
输出:[3, 4, -1, -1, -1]
解释:
子数组 [1, 2, 3] 的最大值为 3。
子数组 [2, 3, 4] 的最大值为 4。
其他子数组不满足连续上升的条件,因此它们的能量值为 -1。
示例二:
输入:nums = [2, 2, 2, 2, 2], k = 4
输出:[-1, -1]
解释:
所有子数组都不满足条件,因此结果为 -1。
示例三:
输入:nums = [3, 2, 3, 2, 3, 2], k = 2
输出:[-1, 3, -1, 3, -1]
解释:
只有子数组 [2, 3] 满足条件。
二、解题思路
为了找出每个长度为 k 的子数组的能量值,我们可以采取以下步骤:
1.遍历数组,提取从当前索引开始的所有长度为 k 的子数组。
2.计算当前子数组的最大值。
3.检查子数组是否满足“依次连续且上升”的条件:
(1)如果满足,则把最大值加入结果数组。
(2)如果不满足,则结果数组中加入 -1。
三、代码实现
1.引入库
代码如下:
class Solution(object):
def resultsArray(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
n = len(nums)
results = [] # 存储每个子数组的能量值
# 遍历所有长度为 k 的子数组
for i in range(n - k + 1):
# 提取当前的子数组
sub_array = nums[i:i + k]
max_value = max(sub_array) # 计算当前子数组的最大值
# 检查子数组是否满足严格递增且连续的条件
is_consecutive_and_increasing = True
for j in range(k - 1):
if sub_array[j] + 1 != sub_array[j + 1]: # 当前元素 + 1 应该等于下一个元素
is_consecutive_and_increasing = False
break
# 如果符合条件,将最大值添加到结果,否则添加 -1
if is_consecutive_and_increasing:
results.append(max_value)
else:
results.append(-1)
return results
# 测试示例
solution = Solution()
print(solution.resultsArray([1, 2, 3, 4, 3, 2, 5], 3)) # 输出 [3, 4, -1, -1, -1]
print(solution.resultsArray([2, 2, 2, 2, 2], 4)) # 输出 [-1, -1]
print(solution.resultsArray([3, 2, 3, 2, 3, 2], 2)) # 输出 [-1, 3, -1, 3, -1]
2.代码解释
1.输入和初始化:
使用 results 列表来存储每个子数组的能量值。通过 n = len(nums) 来获取数组长度。
2.遍历子数组:
使用 for 循环从 0 到 n - k 遍历所有可能的子数组。每次迭代通过切片提取当前子数组。
3.最大值计算:
调用 max() 函数来获取当前子数组中的最大元素。
4.条件检查:
使用嵌套循环检查子数组是否满足连续且上升的条件。
如果条件满足,将最大值加入到结果列表中;如果不满足,加入 -1。
总结
时间复杂度:
由于需要遍历所有子数组并计算最大值,时间复杂度为 O(n * k),其中 n 是数组长度,k 是子数组的长度。
空间复杂度:
除了输入数组和结果数组,我们使用的额外空间是常量,因此空间复杂度为 O(1)。