当前位置:   article > 正文

算法——求连续子序列的和_一个整数序列所有连续子序列的中位数之和

一个整数序列所有连续子序列的中位数之和

对于给定的一个长度为n的整数序列,要求计算出最大的连续子数组和。以a[]={1,2,-9,5,8,2,6,-8}为例,最大和为5+8+2+6=21;

首先,是连续的子序列,再则所求和最大,那要怎样查找呢?

话不多说,一下是三种常见解法:(以函数形式呈现)

法一:一重循环

  1. int sum(int a[], int n)
  2. {
  3. int max = 0; // 最大子数组和,初始化为 0
  4. int b = 0; // 当前子数组和,初始化为 0
  5. int i, j;
  6. for(i = 0; i < n; i++) // 遍历数组 a
  7. {
  8. b += a[i]; // 将 a[i] 添加到当前子数组中
  9. if(b > max) // 如果当前子数组和大于最大子数组和
  10. max = b; // 更新最大子数组和
  11. else if(b < 0) // 如果当前子数组和小于 0,说明对后面的子数组和无贡献,将当前子数组和清零
  12. b = 0;
  13. }
  14. return max; // 返回最大子数组和
  15. }

 

对于法一:这是一个比较经典的算法,又叫 Kadane 算法。它的思路很简单,遍历整个数组,每次将当前元素加入当前子数组中,并比较当前子数组和是否超过之前的最大子数组和,如果是,就更新最大子数组和;如果当前子数组和小于 0,说明对后面的子数组和无贡献,将当前子数组和清零,重新计算后面的子数组和。
这个算法的时间复杂度为 O(n),比较高效,也比较容易理解。

法二:两重循环

  1. int sum(int* a, int n)
  2. {
  3. int i, j, k, max, sub = 0; // 初始化变量
  4. for(i = 0; i < n; i++) // 枚举所有可能的子数组
  5. {
  6. for(j = i; j < n; j++)
  7. {
  8. max = 0; // 初始化子数组和为 0
  9. for(k = i; k <= j; k++) // 计算当前子数组的和
  10. {
  11. max += a[k];
  12. }
  13. if(sub < max) // 如果当前子数组和大于之前最大子数组和
  14. sub = max; // 更新最大子数组和
  15. }
  16. }
  17. return sub; // 返回最大子数组和
  18. }

对于法二:这是一个暴力算法,它的思路是枚举所有可能的子数组,计算每个子数组的和,找到其中最大的。
这个算法的时间复杂度 O(n3),效率比较低,但是它的思路比较直观,也比较易于理解。如果数组规模较小,这个算法的性能表现也不错。

法三:三重循环

  1. int sum(int* a, int n)
  2. {
  3. int i, j; // 定义循环变量
  4. int max = 0, sub = 0; // 初始化最大子数组和和当前子数组和为 0
  5. for(i = 0; i < n; i++) // 枚举所有可能的子数组起始位置
  6. {
  7. sub = 0; // 将当前子数组和清零
  8. for(j = i; j < n; j++) // 计算当前子数组的和即可
  9. {
  10. sub += a[j];
  11. if(sub > max) // 如果当前子数组和大于之前最大子数组和
  12. max = sub; // 更新最大子数组和
  13. }
  14. }
  15. return max; // 返回最大子数组和
  16. }

对于法三:这是另一个暴力算法,它的思路是枚举所有可能的子数组起始位置和终止位置,计算每个子数组的和,找到其中最大的。
这个算法的时间复杂度为 O(n2),略低于上一个暴力算法,但效率仍然比较低。不过它的思路比较易于理解,可以帮助初学者更好地理解动态规划算法的思路。

最后,小编把主函数贴上了,需要的伙伴自取哈

  1. int main()
  2. {
  3. int a[]={1,2,-9,5,8,2,6,-8};
  4. int n=sizeof(a)/sizeof(a[0]);
  5. int t=sum(a,n);
  6. printf("%d",t);
  7. return 0;
  8. }

 

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

闽ICP备14008679号