二分法之最大子段和

article/2025/11/6 22:33:37

1.问题描述:给定一个数组,找出其中可以构成最大数的子段,子段和是由连续的子段构成的;给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值。

2.设计思路:对于一个连续的子段和,如果把数组一分为二,那么最大的和有三种情况:在center的左边、右边,左右结合;所以只需要分别求出这三种情况的和,进行比较得到最大的和即可;其中的递归出口为right=left,也就是小子段中只剩下一个元素时结束递归。

3.代码:

/*二分法解决最大子段和问题*/
#include<stdio.h>
#include<math.h>
int array[6]={-20,11,-4,13,-5,-2};				//定义有六个元素的数组,保存信息 
int array2[9]={-1,4,-3,1,5,-1,4,-5,2};
int bigger(int a,int b)				//自定义一个求解最大数的函数 
{return a>b ? a:b;} 
int SubSegmentSum(int array[],int left,int right)
{int sum=0,leftsum=0,midsum=0,rightsum=0;         //分别保存最后的sum、左边、中间、右边的最大子段和 int center; 					  //中间分界线 int s1,lefts,s2,rights;			//记录最大子段和为两边时的和 if(left==right)					  {sum=array[left];			//只有一个元素时sum=array[left]或者array[right] } else{center=(left+right)/2;//printf(" %d\n",center);leftsum= SubSegmentSum(array,left,center);			//求左边的最大子段和rightsum=SubSegmentSum(array,center+1,right);			//求右边的最大子段和s1=0,lefts=0;for(int i=center;i>=left;i--)					//从中间开始往左边求最大子段和 {lefts+=array[i];if(lefts>s1){s1=lefts;}} s2=0,rights=0;for(int i=center+1;i<=right;i++)				//从中间开始往右边求最大子段和 {rights+=array[i];if(rights>s2){s2=rights;}}midsum=s1+s2;						//中间的最大子段和  sum=bigger(bigger(leftsum,rightsum),midsum);		//求解最大子段和 }return sum;
}
int main()
{int sum1=SubSegmentSum(array,0,5);int sum2=SubSegmentSum(array2,0,8);printf("%d\n",sum1);printf("%d\n",sum2);return 0;
}

4.运行结果:

5.总结:

最大子段和问题,关键是清楚连续的最大子段和的三种情况:左边、右边和左边加右边,分别求出三种情况下的最大子段和,进行比较即可以得到最大的子段和。

 


http://chatgpt.dhexx.cn/article/L5wtdGI6.shtml

相关文章

java动态规划求最大子段和_动态规划-最大子段和

2018-01-14 21:14:58 一、最大子段和问题 问题描述&#xff1a;给定n个整数(可能有负数)组成的序列a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;求该序列的最大子段和。如果所有整数都是负数&#xff0c;那么定义其最大子段和为0。 方法一、最大子段和的简单算法…

四种方法求解最大子段和问题

题目描述 给定一段长度为n的序列&#xff0c;我们需要找到其中一个连续的子段&#xff0c;使这个子段中各个元素加和最大&#xff0c;如果这个数组中全为负整数&#xff0c;我们就定义这个子段和为0. 题目分析 首先我们的目的是找一个局部的子段但加和是全局最大&#xff0c;…

最大子段和问题(分治法和动态规划)

什么是最大子段和&#xff0c;通俗点讲&#xff1a; 最大子段和就是给了一些数&#xff0c;然后你从中找了几个连续的数&#xff0c;这组连续的数的和比任意一组连续的数的和都大&#xff0c;那么你找的这几个连续的数的和就是这些数的最大子段和。 通俗的听不懂你就看这里&am…

最大子段求和

3种算法&#xff1a;最大子段求和 一、问题分析 问题&#xff1a;给定有n个整数(可能为负整数)组成的序列 a 1 , a 2 , . . . , a n , a_1,a_2,...,a_n, a1​,a2​,...,an​,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。 简易算法…

最大子段和问题(3种方法)

给定由n个整数(可能为负整数)组成的序列a1&#xff0c;a2&#xff0c; a3… &#xff0c; an&#xff0c; 寻找它的某个连续子段&#xff0c;使得其和最大。例如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。 1、最大字段和问题的简单算法 (1)枚举法求解&#xff1…

最大子段和(动态规划算法)

最大子段和&#xff08;动态规划算法&#xff09; 文章目录 最大子段和&#xff08;动态规划算法&#xff09;一、思路二、伪代码三、C代码四、输入实例 一、思路 D[i]表示从i开始的最大字段和。&#xff08;但我们不是从前往后找字段结束位置&#xff09; 根据递推公式&#x…

最大子段和——用蛮力算法,分治策略,动态规划算法三种求法(C语言)

目录 一、题目 二、算法求解 1、蛮力算法 伪代码 算法分析 程序 2、分治策略 伪代码 算法分析 程序 3、动态规划算法 伪代码 算法分析 程序 一、题目 设A<a1,a2,...,an>是n个整数的序列&#xff0c;称<ai,....,aj>为该序列的连续子序列&#xff0c;其…

归并排序 java实现_java实现归并排序

归并排序 归并排序&#xff0c;指的是将两个已经排序的序列合并成一个序列的操作。 归并操作的过程如下&#xff1a; 申请空间&#xff0c;使其大小为两个已经排序序列之和&#xff0c;该空间用来存放合并后的序列 设定两个指针&#xff0c;最初位置分别为两个已经排序序列的起…

Java八大算法:归并排序

一、什么是归并排序&#xff1f; 1.概念 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;归并排序对序列的元素进行逐层折半分组&#xff0c;然后从最小分组开始比较排序&#xff0c;合并成一个大的分组&#xff0c;逐层进行…

归并排序(Java代码实现)

基本思想&#xff1a; 将两个或两个以上的有序表合并成一个有序表的过程。常用的归并为2-路归并&#xff0c;就是将两个有序表合为一个有序表。 过程&#xff1a; 先来看一张示意图&#xff1a; 可以看出&#xff0c;归并排序分为分解和合并两个步骤。 分解就是将原数组分解…

归并排序(Java实现)

归并排序&#xff08;Merge Sort&#xff09;是建立在归并操作上的一种有效&#xff0c;稳定的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先…

归并排序java详解

import java.util.Arrays;public class Mergesort {public static void main(String[] args) {int arr[]{8,4,5,7,1,3,6,2};int temp[]new int[arr.length];//归并排序需要一个额外空间mergeSort(arr,0,arr.length-1,temp);System.out.println("归并排序后" Arrays.t…

java归并排序(含归并排序代码)

目录 一&#xff1a;归并排序的思想 二&#xff1a;归并排序代码 三&#xff1a;归并排序结果​ 一&#xff1a;归并排序的思想 归并排序&#xff08;Merge Sort&#xff09; 当我们要排序这样一个数组的时候&#xff0c;归并排序法首先将这个数组分成一半。如图&#xff1a…

归并排序java代码实现

归并排序,是一种分治算法。利用递归&#xff0c;将一个大的数据集合分解成小的子集合。将子集合排好序后&#xff0c;再合并起来。归并排序不是原地排序算法,因为它使用到了临时空间&#xff0c;这也是归并排序没有快速排序应用广泛的主要原因&#xff0c;虽然归并排序的时间复…

分治算法实现经典归并排序java实现

目录 1.什么是分治算法 分治法 基本思想 2.分治算法的体现:归并排序 归并排序 基本思想 3.代码实现 1.什么是分治算法 分治法 分治法&#xff0c;字面意思是“分而治之”&#xff0c;就是把一个复杂的1问题分成两个或多个相同或相似的子问题&#xff0c;再把子问题分成…

归并排序 Java实现 简单易懂

归并排序 归并排序采用的是分治(divide-and-conquer)法思想。 1.基本思想&#xff1a; 将待排序元素分成大小大致相同的2个子集合&#xff0c;分别对2个子集合进行排序&#xff0c;最终将排好序的子集合合并成为所要求的排好序的集合。 2.执行过程&#xff1a; 3.时间复杂度…

归并排序java版

归并排序java版 归并排序java版 归并排序java版 好长时间没写过归并排序&#xff0c;在学习并发中又遇到了一个归并排序的demo&#xff0c;于是就想试试自己还能不能写出来&#xff0c;结果没写出来…&#xff0c;看了一些文章后&#xff0c;整理了一下思路&#xff0c;把归并…

归并排序(Java)

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&a…

JAVA编程----归并排序

一、概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每…

归并排序java(内附超详解图文讲解)

目录 归并排序介绍: 归并排序图解&#xff1a; 示意图1 示意图2 归并排序详细步骤&#xff1a; 1.组合 2.分组 完整代码 归并排序介绍: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治(divide- and-conquer)策略(分治法将问题分…