美文网首页
数组查询

数组查询

作者: loick | 来源:发表于2019-11-26 15:40 被阅读0次

Description

Given an array, the task is to complete the function which finds the maximum sum subarray, where you may remove at most one element to get the maximum sum.

思路

1. 暴力(O(n^2))

移除数组中的一个负数,然后求数组的最大子数组;对每一个负数执行上述的操作,取最大值。

怎么求数组的最大子数组呢?

遍历数组,两个变量 当前累加值cur_sum,最大子数组值 ans

for i in [0, 1, ... n-1]
    cur_sum += nums[i]
    ans = max(cur_sum, ans)
    cur_sum = max(cur_sum, 0)
2. 累加左边,累加右边(O(n))

既然可以删除一个数,那换一种思路考虑就是,假设删除的数位置是i,那只需要找出i左边连续的和最大的子数组与右边连续和最大的子数组,两者相加就是结果。这里要注意的是连续,因为我们删除i位置的数,所以左右的数组都是与i连续的。

如果对于每个i都去计算左边与右边最大子数组的话,就会有很多重复计算,时间复杂度还是O(n^2)。

因此我们可以首先算出两个数组left, right 存放每个位置左边有右边最大子数组的和,然后遍历每个位置,取左边加右边最大的值。

python

def solve(nums):
    if max(nums) <= 0:
        return max(nums)
    n = len(nums)
    left = [0] * n
    for i in range(len(nums)-1):
        left[i+1] = max(nums[i]+left[i], 0)

    right = [0] * n
    for i in range(1, len(nums))[::-1]:
        right[i-1] = max(nums[i]+right[i], 0)

    ans = float('-inf')
    for i in range(n):
        ans = max(ans, left[i]+right[i], left[i] + nums[i] + right[i])
    return ans

相关文章

  • javascript 数组查询元素及数组去重

    数组查询部分 使用 数组去重部分

  • Swift 笔记 Array

    字符串和数组转换 //MARK: 遍历数组 数组查询

  • 数组查询

    Description Given an array, the task is to complete the f...

  • 一些js常用方法

    数组中查询索引

  • 三种一维树状数组

    单点修改+区间查询 最基本的树状数组 树状数组入门 模板(洛谷P3374 【模板】树状数组1) 区间修改+单点查询...

  • MongoDB学习 (六):查询

    目录 查询操作 集合查询方法 find() 查询内嵌文档 查询操作符(内含 数组查询) "$gt" 、"$gte"...

  • javascript中常用的数组方法

    数组方法 查询索引 查询索引 检测元素 截取数组元素 删除数组元素 头部添加元素 头部删除元素 尾部添加元素 尾部...

  • PHP数组使用

    数组定义 数组增、删、改 数组查询 数组排序 数组合并、分割 数组比较、去重复 数组长度 数组遍历 数组转换 其他...

  • 刷leetCode算法题+解析(四十六)

    查询后的偶数和 题目:给出一个整数数组 A 和一个查询数组 queries。对于第 i 次查询,有 val = q...

  • HashMap

    数据结构 HashMap 是一个数组,每个item都是一个链表 设计初衷 数组:查询快,插入慢链表:查询慢,查询快...

网友评论

      本文标题:数组查询

      本文链接:https://www.haomeiwen.com/subject/zytywctx.html