当前位置:   article > 正文

简单讲解最大连续子数组问题

最大连续子数组

题目描述:求出一个数组中连续子数组的和

eg:{6,-3,-2,7,-15,1,2,2}  所以最大连续字数组的和为(6,-3,-2,7 )为8。


method one:贪心算法

在使用贪心算法求解最大子数组问题之前,我们就要贪心,贪心的可以让连续的子数组越来越大,那么我们应该怎样贪心呢?

解析:首先我们想要得到数组中最大的连续子数组,那我们就得遍历整个数组,那么我们想要在遍历完数组后就可以得到最大值,所以我们就得尽可能多的在每一个元素遍历时留下最大的数据,从而为下次遇见大数据做好充足的准备。(即机会总是留给做准备的人(数据))

图解:

 就如上图我们一直在使用count保留最多的能量,每次让count + arr[i] 和 arr[i] 相比较然后让较大的再赋值给count。

实现代码:c++

  1. class Solution {
  2. public:
  3. int FindGreatestSumOfSubArray(vector<int> array) {
  4. int max = array[0];
  5. int count = array[0];
  6. for (int i = 1; i < array.size(); i++)
  7. {
  8. if (count + array[i] > array[i])
  9. {
  10. count += array[i];
  11. }
  12. else
  13. {
  14. count = array[i];
  15. }
  16. if (count > max)
  17. {
  18. max = count;
  19. }
  20. }
  21. return max;
  22. }
  23. };
  24. int main()
  25. {
  26. int arr[] = { 6,-3,-2,7,-15,1,2,2 };
  27. vector<int> brr(arr,arr+5);
  28. Solution s;
  29. cout << s.FindGreatestSumOfSubArray(brr) << endl;;
  30. system("pause");
  31. return 0;
  32. }

method two:分治算法

首先给大家看一张图

解析:分治算法的核心就是把一个长的数组分成若干份,分别求出每段的字串的最大值,然后合并计算,比较求出合并后的最大子数组;

注意:每次合并一定要从两个合并区间的中间向两边进行遍历。

实现代码:c++

  1. class Solution {
  2. public:
  3. int _max(vector<int> array, int start, int end)
  4. {
  5. if (start >= end)
  6. {
  7. return array[start];
  8. }
  9. int mid = (start + end) / 2;
  10. int leftmax = _max(array, start, mid);
  11. int rightmax = _max(array, mid + 1, end);
  12. int leftsize = array[mid];
  13. int left = 0;
  14. int rightsize = array[mid + 1];
  15. int right = 0;
  16. int max = 0;
  17. while (start <= mid)
  18. {
  19. left += array[mid];
  20. if (left > leftsize)
  21. {
  22. leftsize = left;
  23. }
  24. mid--;
  25. }
  26. mid = (start + end) / 2 + 1;
  27. while(mid <= end)
  28. {
  29. right += array[mid];
  30. if (right > rightsize)
  31. {
  32. rightsize = right;
  33. }
  34. mid++;
  35. }
  36. max = leftsize + rightsize;
  37. if (leftmax > max)
  38. {
  39. max = leftmax;
  40. }
  41. if (rightmax > max)
  42. {
  43. max = rightmax;
  44. }
  45. return max;
  46. }
  47. int FindGreatestSumOfSubArray(vector<int> array)
  48. {
  49. return _max(array, 0, array.size()-1);
  50. }
  51. };
  52. int main()
  53. {
  54. int arr[] = { 6,-3,-2,7,-15,1,2,2 };
  55. vector<int> brr(arr,arr+8);
  56. Solution s;
  57. cout << s.FindGreatestSumOfSubArray(brr) << endl;;
  58. system("pause");
  59. return 0;
  60. }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/987557
推荐阅读
相关标签
  

闽ICP备14008679号