子数组的最大和[算法]

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的

和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

这个题我的第一感觉就是3层for循环直接进行么,就喜欢暴力for循环,遍历所有可能,还是自己的想法太low

了,其实这个题的时间复杂的度可以变为o(n),下面的代码分别用3个不一样的时间复杂度完成的题,所以代码敲完要 优化,也要问一下其他,自己的代码不一定很棒棒哒。废话也就不多说了,因为这个算法比较简单,所以不多做解释了。

1 时间复杂度为o(n^3)

#include <stdio.h>
#include<stdlib.h>
int main(){
	int n,t;
	int *a;
	int i,j;
	int x=0,y=0,m;
	int max=0,sum=0;
	scanf("%d",&n);
	a=(int *)malloc(sizeof(int)*n);
	for(i=0;i<n;i++)
	  scanf("%d",a+i);
	for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       {
       	  m=j;
       	  sum=0;
    	 for(int k=0;k<i;k++)
    	   sum+=a[m++];
		  if(max<sum)
		    {
		    	 max=sum;
		    	 x=i;
		    	 y=j;
		    }
       }

	}
	printf("x=%d,y=%d\n",x,y);
	if(x>y){t=x;x=y;y=t;}      //如果x>y  ,就进行交换 

	for(i=x;i<=y+1;i++)        //这里+1,是因为数组虽然标记的数加+1才是实际的个数
	   printf("%d ",a[i]);
	printf("\nmax=%d\n",max);
	return 0;
}

2 时间复杂度为o(n^2)

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	int *a;
	int i,j;
	int sum=0,max=0;
	scanf("%d",&n);
	a=(int *)malloc(sizeof(int)*n);
	for(i=0;i<n;i++)
	  scanf("%d",a+i);
	for(i=0;i<n;i++)
	{
		sum=0;      //  sum每次置0
	  for(j=i;j<n;j++)
	  {
	     sum+=a[j];
	     if(max<sum)
	        max=sum;

	  }
	}
	 printf("max=%d\n",max);
	return 0;
}

时间复杂度为o(n)

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	int *a;
	int i;
	int sum=0,bettersum=0;
	scanf("%d",&n);
	a=(int *)malloc(sizeof(int)*n);
	for(i=0;i<n;i++)
	  scanf("%d",a+i);
    for(i=0;i<n;i++){
           sum+=a[i];
           //如果当前和值为零,则把当前和值置为零
		   if(sum<0)
		      sum=0;
		//如果当前和值大于最优值,则最优值记录当前和值
		   if(bettersum<sum)
		      bettersum=sum;    	

    }
    //如果数组全为负值,只需要找到一个最大的负值
	if(0==bettersum) {
		bettersum=a[0];
		for(i=0;i<n;i++){
			if(a[i]>bettersum)
			  bettersum=a[i];
		}
	}

    printf("bettersum=%d\n",bettersum);
	return 0;
} 
时间: 2024-10-09 15:36:20

子数组的最大和[算法]的相关文章

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

微软算法100题03 求子数组的最大和

3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18 思路:使用辅助变量max 记录子数组的最大和,从数组头开始遍历,如果数组元素与之前的总和的sum是负数,则重置sum结果为零,否则将得到的sum值与max比较 如果小于ma

算法 - 求子数组的最大和(C++)

//**************************************************************************************************** // // 求子数组的最大和 - C++ - by Chimomo // // 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. // 求所有子数组的和的最大值.要求时间复杂度为O(n). // 例如输入的数组为5, -22, 13

【编程题目】求子数组的最大和 ☆

3.求子数组的最大和(数组)题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为 O(n).例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,因此输出为该子数组的和 18. 算法里学过,动态规划.具体思路想不起来了,看了看书.要动态算1-i个元素中必须包括第i个元素的最大子段和C[i],A是原始序列 C[i + 1] = A[

求数组中连续子数组的最大和

问题: 求解数组中连续一段子数组和的最大值.例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值为59+26-53+58+97=187 思路: 计算出任意i到j之间连续子数组的和再比较必然能得到最大值,但时间复杂度为O(n^2),我们希望能找出线性时间的算法. 我们注意到,假如数组中全为正数,那么最大和必然为全部数相加:如果数组中有负数,并且如果加上某个负数,子数组的和小于0,则最大和子数组必然不包含这个负数. 基于此,给出以下代码: //计算数组中任何连续子数组

剑指OFFER之最大子向量和(连续子数组的最大和)(九度OJ1372)

题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 输入: 输入有多组数据,每组测试数据包括两行. 第一行为一个整数n(0<=n<=100000),当

C语言强化(三)发现潜在规律——求子数组的最大和

上一篇解答了在栈里面求最小值元素的问题,这一篇,来聊聊怎么找到数组中子数组的最大和. 通过这道题,你可以掌握 如何根据用户输入创建数组 如何在一连串数字中找到和最大的某一段连续数字子串 如何发现问题的潜在规律并利用这个规律设计算法,解决问题 思路 连续数相加要最大,说明左右两边的数肯定不是负数,否则不可能最大 连续数序列中允许存在负数,前提是负数前面的一段正数相加要大于这个负数,否则两者抵消后,和会变小 算法 遍历数组 遇到正数,不断累加,遇到的第一个正数要记录下标 遇到负数,记录下标,把此下标

剑指offer面试题31连续子数组的最大和

一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 二.解题思路 求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子

数对之差的最大值 &amp;&amp; 子数组的最大和

问题1: 在数组中,数字减去他的右边的数字得到一个数对之差,求所有数对之差的最大值. 例如数组{2.4.1.16.7.5.11.9}中,数对之差的最大值是11,是16减去5的结果. 问题2:给定一个含有n 个元素的数列,元素有正有负,找出和最小的一组相邻的书,既给定a[n],是的a[i]+a[i+1]+...+a[j]的和最小. 先看第一道题目: 如果从头遍历,遍历到某一个位置,从这个位置开始遍历到数组结束,看此元素的数对只差的最带值,然后更行当前的数对之差的最大值,O(n^2)的事件复杂度.