编辑
2023-07-13
🤓算法
00
请注意,本文编写于 707 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

题目
自己花了很长时间的,代码改善
需要改进的地方

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。   示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [0] 输出:0 示例 4: 输入:nums = [-1] 输出:-1 示例 5: 输入:nums = [-100000] 输出:-100000   提示: 1 <= nums.length <= 3 * 104 -105 <= nums[i] <= 105   进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

自己花了很长时间的,代码改善

class Solution: def maxSubArray(self, a) : if len(a)==1: return a[0] result =sum(a) max_a = max(a) max_index =a.index(max_a) result1,result2=[],[] if max_index !=0: for i in range(0,max_index+1): max_li = a[i:max_index+1] if sum(max_li) >result and len(max_li)!=0: result1 = max_li result = sum(result1) if max_index !=len(a)-1: for j in range(max_index+1,len(a)): max_li = a[max_index:j] if sum(max_li)>result and len(max_li)!=0: result2 =max_li result = sum(result2) if result1 and result2: result1.extend(result2[1:]) return result

但是,还是有问题,自己后来看了看正确答案,对比了一下:

class Solution: def maxSubArray(self, nums: List[int]) -> int: # 定义dp[i]为前i个数里面的最大子序和 # 举个例子: # nums: [-2, 1, 2] max = 1+2 = 3,最大子序和肉眼可见地为3 # dp[0]:[-2, 0, 0] dp[0] = -2 初始化 # 面临抉择:要不要把前面的最优算进来?如果算进来,就是dp[i-1]+nums[i], 如果不算,就是nums[i] # dp[1]:[-2, 1, 0] max(1, -2+1) = max(1, dp[0]+1) = 1 # dp[2]:[-2, 1, 3] max(2, dp[1]+2) = 3 # 所以dp[i] = max(num[i], d[i-1]+num[i]) # return max(dp)就好 n = len(nums) dp = [0]*n dp[0] = nums[0] for i in range(1,n): dp[i] = max(nums[i], dp[i-1]+nums[i]) return max(dp) 作者:yun6688 链接:https://leetcode-cn.com/problems/maximum-subarray/solution/pythonjie-fa-zui-da-zi-xu-he-by-yun6688-r4h1/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

需要改进的地方

  1. 思路完全不是一个方向的,自己总想着先搞出列表来,然后再搞出最后的值。其实自己的目标错了,最终的结果,只要最大的值,就可以,不需要具体的列表是什么,所以自己相当于走个弯路。
  2. max的使用,对于两两比较,这种认识不清楚。还老是使用if和对比的方法来进行判断。
  3. 解决问题的关键:大神的解法,保留了之前的值,所以到最后,会不断进行叠加,然后最后一位肯定是里边最大的。但是,怎么保持连续呢。因为是先进行叠加,然后来进行比较,所以它可以保持值是最大的。如果出现小的话,根本不会往后边继续循环。
  4. 总的来说,关于算法的题,自己还是需要自己多多练习,多多总结,多多试错,才能成长。加油@@@@@@@@

image.png

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!