https://leetcode-cn.com/problems/contiguous-sequence-lcci/
- 题目
给定一个整数数组,找出总和最大的连续数列,并返回总和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解
- 动态规划
class Solution:
def maxSubArray(self,s:List[int]) ->int: # 定义函数
if s==[]: #当输入为空时
return #返回为空
else:
for i in range(1,len(s)): # 数组不为空时,从索引1开始循环直至结束
s[i]=max(s[i]+s[i-1],s[i]) #重新定义数组 例如 两个一组 max时定义成一组 再与下一个进行比较
return max(s) #返回最大的总和
#int 对象不可迭代!:return max(s[i])改成 return max(s)即可
#s[i]表示数组中int的具体值;s表示更新之后的值
#动态规划
#总结:
#(1)考虑是否为空
#(2)不为空时,s[i]=max(s[i]+s[i-1],s[i])(此思路挺重要)
#(3)输出时,retun返回 max(s)
#时间复杂度:O(n) 空间复杂度:O(1)
以上参考出处:https://leetcode-cn.com/problems/contiguous-sequence-lcci/solution/dong-tai-gui-hua-by-yi-wen-statistics-13/
- 分治算法
class Solution {
public:
// 分治法
int maxSubArray(vector<int>& nums)
{
if(nums.size() == 0) return INT_MIN;
return divide(nums,0,nums.size()-1);
}
int divide(vector<int>& nums, int left, int right)
{
if(left == right) return nums[left];
int mid = (left + right) / 2;
// 1. 最大数列和在左边
int sumLeft = divide(nums,left,mid);
// 2. 最大数列和在右边
int sumRight = divide(nums,mid+1,right);
// 3. 最大数列和在中间
// 先求左边的最大和
int leftSum = 0,leftMaxSum = INT_MIN;
for(int i = mid; i >= left; i--)
{
leftSum += nums[i];
leftMaxSum = max(leftMaxSum,leftSum);
}
// 求右边的最大和
int rightSum = 0,rightMaxSum = INT_MIN;
for(int i = mid + 1; i <= right; i++)
{
rightSum += nums[i];
rightMaxSum = max(rightMaxSum,rightSum);
}
return max(max(sumLeft,sumRight),leftMaxSum+rightMaxSum);
}
};
参考出处:https://leetcode-cn.com/problems/contiguous-sequence-lcci/solution/fen-zhi-he-dong-tai-gui-hua-liang-chong-jie-fa-by-/
- 反思
事实证明,对于我而言, python 思路确实比其他思路容易理解,且能够想的到;不过其他思路也是要学习的