[关闭]
@chawuciren 2018-12-10T16:29:48.000000Z 字数 1022 阅读 578

53. Maximum Subarray

未分类


Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

Follow up:

If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

先说思路

第一个想法是,先算所有两个元素的,再算所有三个元素的。。。以此类推(O(n)?)
改进一下,反着来算,先算arraysize的,再算arraysize-1,嗯。。。假装这是DP。
要算arraysize的,就一定要先算arraysize-1(每次都有两种情况,这些统统记下来,最后比较大小)
返回最大值
这种方法可以画成一颗递归树,底层有2^n-1种可能(元素为n时)。
这里面有很多重复情况,我想只计算一次。
所有的序列都能被分成size-1和1,然后把他们加起来。//全部算出来估计是不可能。。。

递归写不出来,先换种想法
button-up
一开始只有一个元素,大于0就留下,小于0就不留下。
然后加上第二个元素,小于0就不留下,大于0就继续加。
唯独没考虑到,最终结果是负数怎么办?

  1. int maxSubArray(int* nums, int numsSize) {
  2. int p=0;
  3. int t=0;
  4. int j=0;
  5. int a[1000000]={0};
  6. if(numsSize==1)
  7. return nums[0];
  8. if(nums[0]>0)
  9. p=nums[0];
  10. for(int i=1;i<numsSize;i++){
  11. t=p+nums[i];
  12. if(t<0){
  13. p=0;
  14. }
  15. else{
  16. if(p!=0){
  17. a[j]=p;
  18. j++;
  19. }
  20. p=t;
  21. }
  22. a[j]=p;
  23. }
  24. p=max(a,j,p);
  25. return p;
  26. }
  27. int max(int a[],int j,int p){
  28. int t=0;
  29. if(j==0)
  30. return p;
  31. for(int i=0;i<j;i++){
  32. if(a[i]>t)
  33. t=a[i];
  34. }
  35. return t;
  36. }

还是想递归吧。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注