数组与矩阵---未排序数组中累加和小于或等于给定值的最长子数组问题

【题目】  给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和小于或等于k的最长子数组长度。      例如:arr = [3, -2, -4, 0, 6],k = -2,相加和小于或等于-2的最长子数组为[3, -2, -4, 0],所以结果返回4。【基本思路】  该题可以做到时间复杂度O(NlogN),空间复杂度O(N)。   依次求以数组每个位
摘要由CSDN通过智能技术生成

【题目】

  给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和小于或等于k的最长子数组长度。
  
  例如:arr = [3, -2, -4, 0, 6],k = -2,相加和小于或等于-2的最长子数组为[3, -2, -4, 0],所以结果返回4。

【基本思路】

  方法一:时间复杂度O(NlogN),空间复杂度O(N)
  
  依次求以数组每个位置结尾的累加和小于或等于 k 的最长子数组长度。如何找呢?首先生成每个位置的累加和数组 sumArr,对于每一个位置 i,要求以该位置结尾的累加和小于或等于k的最长子数组,实际上只要找到 sumArr[0…i] 中第一个大于或等于sum-k的位置,假设位置为 index,那么 arr[index+1…i] 就是以 i 位置结尾的累加和小于或等于 k 的最长子数组。

  那么如何快速的求出 sumArr[0…i] 中第一个大于或等于 sum-k 的位置呢?假设累加和数组sumArr = [0,1, 3, 2, 7, 5]。注意这里数组的第一项0表示没有任何一个数时的累加和,它的存在是为了防止以 0 位置开头的子数组的丢失(这个在未排序数组中累加和为给定值的最长子数组中已经分析过)。对于数组sumArr我们可以将它转变为 [0, 1, 3, 3, 7, 7],为什么呢?因为我们只关心第一个大于 sum-k 的位置,如果累加和为 2 已经大于 sum-k,那么累加和 3 必定也大于 sum-k,所以只要保留一个更大的、出现更早的累加和就可以。转变后的数组很显然是一个有序数组,那么我们就可以使用二分查找在 logN 的时间复杂度内找到第一个大于或等于 sum-k 的位置。如果不转变成有序数组,很显然,我们需要用 N 的复杂度去遍历寻找满足条件的位置。

  具体实现参见如下代码:

#python3.5
def maxLen(arr, k):
    def getLessIndex(h, num, index):
        left = 0
        right = index
        res = 1
        while left <
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值