利用分而治之求最大子列和

简介: 利用分而治之求最大子列和

一、什么是分而治之?

           

分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以:

  • 1) 把它分成两个或多个更小的问题;
  • 2) 分别解决每个小问题;3) 把各小问题的解答组合起来,即可得到原问题的解答。

小问题通常与原问题相似,可以递归地使用分而治之策略来解决。

二、求最大子列和

对于这个问题,我们首先将数组分解:

然后求出每个序列的最大和,但是在合并的时候有三种情况:

  • 最大序列和出现在左序列
  • 最大序列和出现在右序列
  • 最大序列和由左右序列的部分组成

对于这三种情况,进行比较,取最大

代码实现 :

#include<stdio.h>
#include<limits.h>
#include<math.h>
int max(int a, int b)
{
  return a > b ? a : b;
}
int maxsubArray(int num[], int low, int high)
{
  if (low == high)
  {//分解到只有一个元素的情况
    if (num[low] > INT_MIN)
    {
      return num[low];
    }
    else
    {
      return INT_MIN;
    }
  }
  int mid = (low + high) / 2;//从中间元素开始分解
  int maxLeft=maxsubArray(num, low, mid);//求左边的最大子序列和
  int maxRight=maxsubArray(num, mid + 1, high);//求右边的最大子序列和
  //最大序列和由左右序列的部分组成
  int sumLeft = INT_MIN;
  int sumRight = INT_MIN;
  int a = 0, b = 0;
  for (int i =mid; i>=low; i--)
  {
    a += num[i];
    if (a > sumLeft)
    {
      sumLeft = a;
    }
  }
  for (int j = mid + 1; j <= high; j++)
  {
    b += num[j];
    if (b > sumRight)
    {
      sumRight = b;
    }
  }
  int sum = sumLeft + sumRight;
  return max(max(maxLeft, maxRight), sum);
 
}
int main()
{
  int num[12] = { 1,-2,4,5,-2,8,3,-2,6,3,7,-1 };
  printf("%d\n",maxsubArray( num,0, 11));
  return 0;
}

运行结果:


目录
相关文章
|
Web App开发 存储 JavaScript
基于Node.js的简易博客系统设计与实现
基于Node.js的简易博客系统设计与实现
301 3
|
缓存 监控 负载均衡
CPU占用率爆表:高效诊断与解决策略
面对CPU占用率飙升至100%的情况,系统管理员和开发人员需要迅速采取行动以避免性能瓶颈和系统崩溃。本文将提供一系列诊断和解决CPU占用过高问题的实用方法。
1129 4
|
人工智能 算法 安全
人工智能在医疗诊断中的应用与挑战
本文深入探讨了人工智能(AI)技术在医疗诊断领域的应用情况,包括其在影像学、病理学和遗传学中的实际应用案例。同时,文章分析了AI在医疗诊断中面临的主要挑战,如数据隐私保护、算法透明度和跨学科合作的难题,并提出了相应的解决策略。最后,展望了AI技术未来在医疗诊断领域的发展潜力和可能的改进方向。
|
Prometheus 监控 Cloud Native
Prometheus监控平台配置--监控集群资源信息
在scrape_configs 配置项下添加Linux 监控的job,其中 IP 修改为上面部署node_exporter机器的ip,端口号为9100,需要注意缩进。
406 6
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之一次查询只能显示1万条数据,如何调整这个数值
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
224 0
|
机器学习/深度学习 存储 计算机视觉
YOLOv5改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
YOLOv5改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
398 0
|
JavaScript 前端开发
Vue 3中如何处理懒加载?
在 Vue 3 中,处理懒加载的方式与 Vue 2 中有所不同。Vue 3 推荐使用 Suspense 和 defineAsyncComponent 来实现组件的懒加载。
241 0
|
SQL JSON SpringCloudAlibaba
Spring Boot如何优雅提高接口数据安全性
在Spring Boot项目中提高接口安全的核心所在:**加密和加签**,加固接口参数、验证复杂度。 **加密:**对参数进行加密传输,拒绝接口参数直接暴露,这样就可以有效做到防止别人轻易准确地获取到接口参数定义和传参格式要求了。 **加签:**对接口参数进行加签,可以有效防止接口参数被篡改和接口参数被重放恶刷。
2681 1
Spring Boot如何优雅提高接口数据安全性
|
Web App开发 iOS开发 JavaScript
键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leolai/archive/2012/08/01/2618386.
2243 0
|
Oracle 前端开发 Java
java实现遍历树形菜单方法——设计思路【含源代码】
java实现遍历树形菜单方法——设计思路【含源代码】