当前位置: 首页 > 知识库问答 >
问题:

简单的算法-Leet代码-最大子数组

苏淇
2023-03-14

我一直在纠结这件事。

最大子数组简单给定一个整数数组数,找到总和最大的相邻子数组(至少包含一个数字)并返回其总和。

子数组是数组的连续部分。

示例1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:[4,-1,2,1]的和最大= 6。示例2:

输入:nums=[1]输出:1示例3:

输入: 数字 = [5,4,-1,7,8] 输出: 23

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        subarray1=[]
        subarray2=[]
    
        for n in nums:
            subarray1.append(sum(nums[nums.index(n):]))
            nums2=nums[::-1]
            subarray2.append(sum(nums2[nums.index(n):]))
            para1=subarray1.index(max(subarray1))
            para2=len(nums)-subarray2.index(max(subarray2))
            ans=sum(nums[para1:para2])
        
        if sum(nums)>ans :
            ans=sum(nums)
        
        if len(nums)==2 and sum(nums)< nums[0] or nums[1] :
            ans=max(nums)
       
        return ans

我不明白迭代逻辑,视频中的答案是错误的。我的逻辑是创建一个对两边的输入数组求和的数组,并使用这两个数组上最大值的索引来计算出子数组参数的最大和。

当复制到leet代码时,我的答案可能是错误的https://leetcode.com/problems/maximum-subarray/

已经尝试了几个小时,它被标记为简单。我相信有一种简单的迭代方法可以做到这一点,但到目前为止,我搜索的所有内容都是错误的。

共有3个答案

袁安志
2023-03-14

这是我的解决方案,尽管当输入列表包含很多元素时,它超出了时间限制。我的想法是尝试每个子列表的总和,并相应地更新最大总和。使用“分而治之”的方法有一种更快,但更复杂的方法:https://leetcode.com/problems/maximum-subarray/discuss/1849465/Divide-and-Conquer-Approach-with-Python

我的解决方案(适用于200/209例,因为超过了时间限制):

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = - 10 ** 4

        for i in range(len(nums)):
            for j in range(i + 1, len(nums) + 1):
                s = sum(nums[i:j])
                if max_sum < s:
                    max_sum = s
        return max_sum
凤衡
2023-03-14
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            if nums[i-1] > 0:
                nums[i] += nums[i-1]
        return max(nums)

这是一个具有恒定空间的2遍O(n)时间复杂度解。

工作原理:我们将每个元素添加到它的前一个元素中,前提是前一个元素大于0(大于或等于也可以)。想法是这样的:如果负数已经设法使它小于0,我们就丢弃前缀,不再关心它们。但是如果剩余一些正值,我们会添加它,因为它比什么都没有好。

最后,我们寻找最大值。

为了使它一次通过,您可以有一个在每次迭代中取最大值的< code>best值。那么你就不需要在数组末尾再次循环来取最大值。

这是通过Kadane的算法,如果你有兴趣进一步阅读它。

吕鹏
2023-03-14

其中许多问题都有一个标准的逻辑。假设您知道总数最大的子数组是nums[:n-1]。那么,子数组nums[:n]的最大总数是多少?

有两种可能性:

  • 新答案不包含nums[n-1]。在这种情况下,它必须与旧答案相同
  • 新答案确实包含nums[n-1]

因此…实际的算法是您迭代遍历数组,反复向数组添加新元素,并跟踪两个答案:

  1. 什么是总数最大的子阵列
  2. 包含最后一个元素的总计最大的子数组是什么。(此答案可能与前一个答案相同。

然后,当您将新元素添加到数组的末尾时:

  1. 总数最大的子数组是(a)前一个最大的总数或(b)前一个最大的总数,其中包含最后一个元素加上新的最后一个元素,或者(c)只是最后一个元素。选择总数最大的一个。
  2. 包含最后一个元素的总数最大的子数组是上面(b)或(c)中较大的一个。
 类似资料:
  • 我在做关于Leetcode上大多数水问题的容器 问题: 给定n个非负整数a1,a2。。。,an,其中每个代表坐标(i,ai)处的一个点。绘制n条垂直线,使线i的两个endpoint位于(i,ai)和(i,0)。找到两条线,这两条线与x轴一起构成一个容器,使容器包含最多的水。 注意:容器不能倾斜,n至少为2。 问题链接:https://leetcode.com/problems/container-

  • 问题内容: 在javascript中实现数组交集的最简单,无库代码是什么?我想写 并得到 问题答案: 使用的组合和: 或者,如vrugtehagel在注释中建议的那样,您可以使用更新的代码甚至更简单的代码: 对于较旧的浏览器:

  • 我偶然发现了这个问题上的CodurityLessons,这里是描述: 给出了一个由N个整数组成的非空零索引数组A。 一个三元组(X,Y,Z),使得≤ 十、 双切片(X,Y,Z)的和是A[x1]A[x2]的总和。。。A[Y]− 1] A[Y 1]A[Y 2]。。。A[Z]− 1]. 例如,数组A使得: 包含以下双切片示例: 双层(0,3,6),总和为2 6 4 5 = 17, 双层(0,3,7),和

  • 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 实现方案如下: /** * @param {number[]}

  • 本文向大家介绍C++实现大数乘法算法代码,包括了C++实现大数乘法算法代码的使用技巧和注意事项,需要的朋友参考一下 C++实现大数乘法算法代码 以上就是本文所述的全部内容了,希望大家能够喜欢。

  • 一、引入 在计算机科学中,团问题指的是在给定的图中找到团(顶点的子集,都彼此相邻,也称为完全子图)的计算问题。 团的问题在现实生活中也有体现。例如我们考虑一个社交网络,其中图的点代表用户,图的边代表其所连接的两个用户互相认识。那么我们找到了一个团,也就找到了一群互相认识的人。 我们如果想要找到这个社交网络中最大的一群互相认识的人,那么就需要用到最大团搜索算法,最大团指的是点数量最多的极大团。 二、