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

2021-07-10:请返回arr中,求子数组的累加和,是<=K

原创
作者头像
福大大架构师每日一题
修改2021-07-12 10:09:40
修改2021-07-12 10:09:40
3900
举报

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

福大大 答案2021-07-10:

时间紧。见代码。

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

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

代码语言:txt
复制
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代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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