我一直在纠结这件事。
最大子数组简单给定一个整数数组数,找到总和最大的相邻子数组(至少包含一个数字)并返回其总和。
子数组是数组的连续部分。
示例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/
已经尝试了几个小时,它被标记为简单。我相信有一种简单的迭代方法可以做到这一点,但到目前为止,我搜索的所有内容都是错误的。
这是我的解决方案,尽管当输入列表包含很多元素时,它超出了时间限制。我的想法是尝试每个子列表的总和,并相应地更新最大总和。使用“分而治之”的方法有一种更快,但更复杂的方法: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
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的算法,如果你有兴趣进一步阅读它。
其中许多问题都有一个标准的逻辑。假设您知道总数最大的子数组是nums[:n-1]
。那么,子数组nums[:n]
的最大总数是多少?
有两种可能性:
nums[n-1]
。在这种情况下,它必须与旧答案相同nums[n-1]
。因此…实际的算法是您迭代遍历数组,反复向数组添加新元素,并跟踪两个答案:
然后,当您将新元素添加到数组的末尾时:
我在做关于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++实现大数乘法算法代码 以上就是本文所述的全部内容了,希望大家能够喜欢。
问题内容: 用Java编写的相对简单的算法来解决Rubik立方体。效率也很重要,但是次要考虑因素。 问题答案: 我发现的最简单的 非平凡 算法是这个: http://www.chessandpoker.com/rubiks-cube- solution.html 编写代码看起来并不难。YannickM.的答案中提到的链接看起来也不错,但是“ 十字架 ”步骤的解决方案对我来说似乎有点复杂。 您可能想