伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,

来源:本站原创 浏览:93次 时间:2022-03-24

2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。

福大大 答案2021-03-30:

1.前缀和+有序表。时间复杂度O(N*lgN)。无代码。

2.滑动窗口。时间复杂度O(N)。这道题用自然智慧想不到,需要练敏感度。有代码。
minSum数组,最小累加和,以i开头最小值。
minSumEnd数组,以i开头最小值,右边界在哪里。
采用滑动窗口,右指针每次移动多位,左指针每次移动一位。
虽然用到了两个for循环,但是右指针不回退,所以复杂度是O(N)。

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

package mainimport "fmt"func main() {    arr := []int{1000, -10, 60, -60, 3, 1, -2, 1, 10}    k := 1    ret := maxLengthAwesome(arr, k)    fmt.Println(ret)}func maxLengthAwesome(arr []int, k int) int {    if len(arr) == 0 {        return 0    }    minSums := make([]int, len(arr))    minSumEnds := make([]int, len(arr))    minSums[len(arr)-1] = arr[len(arr)-1]    minSumEnds[len(arr)-1] = len(arr) - 1    for i := len(arr) - 2; i >= 0; i-- {        if minSums[i+1] < 0 {            minSums[i] = arr[i] + minSums[i+1]            minSumEnds[i] = minSumEnds[i+1]        } else {            minSums[i] = arr[i]            minSumEnds[i] = i        }    }    // 迟迟扩不进来那一块儿的开头位置    end := 0    sum := 0    ans := 0    for i := 0; i < len(arr); i++ {        // while循环结束之后:        // 1) 如果以i开头的情况下,累加和<=k的最长子数组是arr[i..end-1],看看这个子数组长度能不能更新res;        // 2) 如果以i开头的情况下,累加和<=k的最长子数组比arr[i..end-1]短,更新还是不更新res都不会影响最终结果;        for end < len(arr) && sum+minSums[end] <= k {            sum += minSums[end]            end = minSumEnds[end] + 1        }        ans = getMax(ans, end-i)        if end > i { // 还有窗口,哪怕窗口没有数字 [i~end) [4,4)            sum -= arr[i]        } else { // i == end,  即将 i++, i > end, 此时窗口概念维持不住了,所以end跟着i一起走            end = i + 1        }    }    return ans}func maxLength(arr []int, k int) int {    h := make([]int, len(arr)+1)    sum := 0    h[0] = sum    for i := 0; i != len(arr); i++ {        sum += arr[i]        h[i+1] = getMax(sum, h[i])    }    sum = 0    res := 0    pre := 0    llen := 0    for i := 0; i != len(arr); i++ {        sum += arr[i]        pre = getLessIndex(h, sum-k)        if pre != -1 {            llen = i - pre + 1        }        res = getMax(res, llen)    }    return res}func getLessIndex(arr []int, num int) int {    low := 0    high := len(arr) - 1    mid := 0    res := -1    for low <= high {        mid = (low + high) / 2        if arr[mid] >= num {            res = mid            high = mid - 1        } else {            low = mid + 1        }    }    return res}func getMax(a int, b int) int {    if a > b {        return a    } else {        return b    }}

执行结果如下:


左神java代码
评论

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net