2025-08-19:好数字之和。用go语言,给定一个整数数组 nums 和一个整数 k。对于每个下标 i,若与它相距 k 的左
【摘要】 2025-08-19:好数字之和。用go语言,给定一个整数数组 nums 和一个整数 k。对于每个下标 i,若与它相距 k 的左边位置 i-k 和右边位置 i+k(若存在的话)上的元素都比 nums[i] 小,则称 nums[i] 为“好”元素;若这两个位置中有任意一个越界,则该位置的元素也被视为“好”的。求出数组中所有“好”元素之和并返回。2 <= nums.length <= 100。1...
2025-08-19:好数字之和。用go语言,给定一个整数数组 nums 和一个整数 k。对于每个下标 i,若与它相距 k 的左边位置 i-k 和右边位置 i+k(若存在的话)上的元素都比 nums[i] 小,则称 nums[i] 为“好”元素;若这两个位置中有任意一个越界,则该位置的元素也被视为“好”的。求出数组中所有“好”元素之和并返回。
2 <= nums.length <= 100。
1 <= nums[i] <= 1000。
1 <= k <= floor(nums.length / 2)。
输入: nums = [1,3,2,1,5,4], k = 2。
输出: 12。
解释:
好的数字包括 nums[1] = 3,nums[4] = 5 和 nums[5] = 4,因为它们严格大于下标 i - k 和 i + k 处的数字。
题目来自力扣3452。
分步描述过程:
-
初始化总和:首先,初始化一个变量
ans为 0,用于累加所有“好”元素的和。 -
遍历数组:遍历数组
nums中的每一个元素nums[i],其中i是当前元素的下标(从 0 开始)。 -
检查左边位置
i-k:- 如果
i-k越界(即i < k),则左边视为“满足条件”(因为越界被视为“好”)。 - 如果
i-k不越界(即i >= k),则需要检查nums[i]是否严格大于nums[i-k]。如果是,则左边满足条件;否则不满足。
- 如果
-
检查右边位置
i+k:- 如果
i+k越界(即i+k >= len(nums)),则右边视为“满足条件”(因为越界被视为“好”)。 - 如果
i+k不越界(即i+k < len(nums)),则需要检查nums[i]是否严格大于nums[i+k]。如果是,则右边满足条件;否则不满足。
- 如果
-
判断是否为“好”元素:
- 如果左边和右边都满足条件(即左边越界或
nums[i] > nums[i-k],且右边越界或nums[i] > nums[i+k]),则nums[i]是一个“好”元素。 - 将该“好”元素的值
nums[i]累加到ans中。
- 如果左边和右边都满足条件(即左边越界或
-
返回结果:遍历完所有元素后,返回累加的结果
ans。
示例分析:
以输入 nums = [1,3,2,1,5,4] 和 k = 2 为例:
i=0(nums[0]=1):i-k = -2(越界,左边满足)。i+k = 2(nums[2]=2,1 > 2不成立,右边不满足)。- 不是“好”元素。
i=1(nums[1]=3):i-k = -1(越界,左边满足)。i+k = 3(nums[3]=1,3 > 1成立,右边满足)。- 是“好”元素,累加 3。
i=2(nums[2]=2):i-k = 0(nums[0]=1,2 > 1成立,左边满足)。i+k = 4(nums[4]=5,2 > 5不成立,右边不满足)。- 不是“好”元素。
i=3(nums[3]=1):i-k = 1(nums[1]=3,1 > 3不成立,左边不满足)。i+k = 5(nums[5]=4,1 > 4不成立,右边不满足)。- 不是“好”元素。
i=4(nums[4]=5):i-k = 2(nums[2]=2,5 > 2成立,左边满足)。i+k = 6(越界,右边满足)。- 是“好”元素,累加 5。
i=5(nums[5]=4):i-k = 3(nums[3]=1,4 > 1成立,左边满足)。i+k = 7(越界,右边满足)。- 是“好”元素,累加 4。
- 最终累加结果:
3 + 5 + 4 = 12。
时间复杂度:
- 遍历数组一次,时间复杂度为
O(n)。 - 对于每个元素,最多进行两次比较(左边和右边),每次比较是
O(1)。 - 因此,总时间复杂度为
O(n)。
额外空间复杂度:
- 只使用了常数级别的额外空间(如
ans变量),不随输入规模变化。 - 因此,额外空间复杂度为
O(1)。
总结:
- 时间复杂度:
O(n)。 - 额外空间复杂度:
O(1)。
Go完整代码如下:
package main
import (
"fmt"
)
func sumOfGoodNumbers(nums []int, k int) (ans int) {
for i, x := range nums {
if (i < k || x > nums[i-k]) && (i+k >= len(nums) || x > nums[i+k]) {
ans += x
}
}
return
}
func main() {
nums := []int{1, 3, 2, 1, 5, 4}
k := 2
result := sumOfGoodNumbers(nums, k)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def sum_of_good_numbers(nums, k):
ans = 0
n = len(nums)
for i, x in enumerate(nums):
if (i < k or x > nums[i - k]) and (i + k >= n or x > nums[i + k]):
ans += x
return ans
if __name__ == "__main__":
nums = [1, 3, 2, 1, 5, 4]
k = 2
result = sum_of_good_numbers(nums, k)
print(result)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)