前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-07-10:请返回arr中,求子数组的累加和,是<=K的并且是最大的。返回这个最大的累加和。

2021-07-10:请返回arr中,求子数组的累加和,是<=K的并且是最大的。返回这个最大的累加和。

作者头像
福大大架构师每日一题
发布2021-08-05 16:22:31
4430
发布2021-08-05 16:22:31
举报

2021-07-10:请返回arr中,求子数组的累加和,是<=K的并且是最大的。返回这个最大的累加和。

福大大 答案2021-07-10:

时间紧。见代码。

时间复杂度:O(N*logN)。空间复杂度:O(N)。

代码用golang编写。代码如下:

代码语言:javascript
复制
package main

import (
    "fmt"
    "math"
    "sort"
)

func main() {
    arr := []int{1, 4, -3, 4, -5}
    ret := getMaxLessOrEqualK(arr, 7000)
    fmt.Println(ret)
}

// 请返回arr中,求个子数组的累加和,是<=K的,并且是最大的。
// 返回这个最大的累加和
func getMaxLessOrEqualK(arr []int, K int) int {
    // 记录i之前的,前缀和,按照有序表组织
    set := make([]int, 0)
    map0 := make(map[int]struct{})
    // 一个数也没有的时候,就已经有一个前缀和是0了
    set = append(set, 0)
    map0[0] = struct{}{}
    max := math.MinInt64
    sum := 0
    // 每一步的i,都求子数组必须以i结尾的情况下,求个子数组的累加和,是<=K的,并且是最大的
    for i := 0; i < len(arr); i++ {
        sum += arr[i] // sum -> arr[0..i];
        sort.Ints(set)
        index := NearestIndex(set, sum-K)
        if index != -1 {
            max = getMax(max, sum-index)
        }
        if _, ok := map0[sum]; !ok {
            set = append(set, sum) // 当前的前缀和加入到set中去
            map0[sum] = struct{}{}
        }
    }
    return max

}

func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

// 在arr上,找满足>=value的最左位置
func NearestIndex(arr []int, v int) int {
    L := 0
    R := len(arr) - 1
    index := -1 // 记录最左的对号
    for L <= R {
        mid := L + (R-L)>>1
        if arr[mid] >= v {
            index = mid
            R = mid - 1
        } else {
            L = mid + 1
        }
    }
    return index
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class14/Code02_MaxSubArraySumLessOrEqualK.java)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档