前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2024-06-26:用go语言,给定一个长度为n的数组nums和一个正整数k, 找到数组中所有相差绝对值恰好为k的子数组, 并

2024-06-26:用go语言,给定一个长度为n的数组nums和一个正整数k, 找到数组中所有相差绝对值恰好为k的子数组, 并

作者头像
福大大架构师每日一题
发布2024-08-16 16:49:55
发布2024-08-16 16:49:55
7200
代码可运行
举报
运行总次数:0
代码可运行

2024-06-26:用go语言,给定一个长度为n的数组nums和一个正整数k,

找到数组中所有相差绝对值恰好为k的子数组,

并返回这些子数组中元素之和的最大值。

如果找不到这样的子数组,返回0。

输入:nums = [-1,3,2,4,5], k = 3。

输出:11。

解释:好子数组中第一个元素和最后一个元素的差的绝对值必须为 3 。好子数组有 [-1,3,2] 和 [2,4,5] 。最大子数组和为 11 ,对应的子数组为 [2,4,5] 。

答案2024-06-26:

chatgpt

题目来自leetcode3026。

大体步骤如下:

1.初始化变量:设定初始答案 ans 为负无穷大(math.MinInt),创建一个空的 map minS 用来存储元素之和为某特定值的最小下标,初始化总和 sum 为 0。

2.遍历输入数组 nums:对于数组中的每个元素 x:

  • • 查找 x+k 是否在 minS 中,如果在,则更新 ans 为 sum + x - minS[x+k] 与 ans 的最大值。
  • • 查找 x-k 是否在 minS 中,如果在,则更新 ans 为 sum + x - minS[x-k] 与 ans 的最大值。
  • • 查找 x 是否在 minS 中,如果不存在或者 sum 小于 minS[x],则更新 minS[x] 为 sum。
  • • 更新当前总和 sum。

3.最终判断 ans 是否仍为负无穷大,如果是,则返回 0,否则将 ans 转换为 int64 类型后返回。

总的时间复杂度为 O(n),其中 n 为输入数组的长度。这是因为算法只需要一次遍历输入数组。

总的额外空间复杂度也是 O(n),因为使用了一个 map 来存储元素之和为特定值的最小下标,当输入数组中所有元素都不相差绝对值恰好为 k 时,map 中最多会存储 n 个元素。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
package main

import(
"fmt"
"math"
)

func maximumSubarraySum(nums []int, k int)int64{
    ans := math.MinInt
    minS :=map[int]int{}
    sum :=0
for _, x :=range nums {
        s, ok := minS[x+k]
if ok {
            ans = max(ans, sum+x-s)
}

        s, ok = minS[x-k]
if ok {
            ans = max(ans, sum+x-s)
}

        s, ok = minS[x]
if!ok || sum < s {
            minS[x]= sum
}

        sum += x
}
if ans == math.MinInt{
return0
}
returnint64(ans)
}

func main(){
    nums :=[]int{-1,3,2,4,5}
    k :=3
    fmt.Println(maximumSubarraySum(nums, k))
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
# -*-coding:utf-8-*-

defmaximum_subarray_sum(nums, k):
    ans =float('-inf')
    min_s ={}
    sum_val =0

for x in nums:
if x + k in min_s:
            ans =max(ans, sum_val + x - min_s[x + k])

if x - k in min_s:
            ans =max(ans, sum_val + x - min_s[x - k])

if x notin min_s or sum_val < min_s[x]:
            min_s[x]= sum_val

        sum_val += x

if ans ==float('-inf'):
return0
return ans

nums =[-1,3,2,4,5]
k =3
print(maximum_subarray_sum(nums, k))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
  • Go完整代码如下:
  • Python完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档