子数组的和2

#include<iostream>
using namespace std;
#define Nu 100000

int main()
{
    int a[Nu],k;

    cout<<"随机产生数组为:";
    for(int i=0;i<Nu;i++)
    {
        k=rand()%2;
        do
        a[i]=rand();
        while(a[i]>100);
        a[i]=k==1?a[i]:-a[i];
        cout<<a[i]<<"  ";
    }
    cout<<endl;

    int sum=a[0],b=a[0],x=0,y=0;
    for(int i=0; i<Nu; i++)
    {
        if(b<0)
        { b=a[i];x=i;}
        else
            b+=a[i];
        if(sum<=b)
        {  sum=b;y=i;}
    } 

    cout<<x<<endl<<y<<endl;
    cout<<"相邻子数组最大和为:"<<sum<<endl;

    cout<<"相应子数组为:";
    for(int i=x;i<=y;i++)
        cout<<a[i]<<" ";
    cout<<endl;

    return 0;
}
时间: 2024-10-10 07:31:01

子数组的和2的相关文章

求连续子数组的最大和

一.题目: 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8. 二.解法: 解法一:暴力求解法 /* (1) 常规方法,时间复杂度O(n*n) (2) 先从第一个元素开始向后

子数组之和

给定一个整数数组,找到和为零的子数组.你的代码应该返回满足要求的子数组的起始位置和结束位置 样例 给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3]. 思路:这道题最开始我的想法是用两重宣传去查找第一组连续数字和为0的两端,会发现这种情况算法的复杂度是O(n*n);应该是挺复杂的方法:之后又看到了这样的算法,我们从第一个开始,把对于每一个元素而言的前n项和求出来,当出现sum(j)=sum(i)(j>i)时,即可认为第i+1项到第j项的总和为0:这是一个很巧妙的算法.所

[算法导论]4.1-5最大连续子数组问题

在线性时间内非递归的求数组的最大连续子数组(连续和最大的子数组). 题目给出思路为数组A[1...j+1]的最大和子数组,有两种情况:a) A[1...j]的最大和子数组; b) 某个A[i...j+1]的最大和子数组,但思考很久没有理解如何用这个思路设计线性时间算法,希望有人能给予指点. (i点是使A[1]+..+A[i]为负的一个值?) 目前的思路是,最大子数组一定位于从某个正数开始,全部求和<=0的一段数组中 从其实点i到目标点j,从第一个正数开始截取尽量长的一段数组,从第一个正数起的最大

一个数组中连续子数组的最大和

//连续子数组的最大和     //{ 1, -2, 3, 10, -4, 7, 2, -5 };//最大子数组18     #include<iostream>     using namespace std;     bool g_InValid = false;     int FindGreatSumOfSubArray(int* arr, int size)     {     if (arr == NULL || size <= 0)     g_InValid = true

【编程之美】求数组的子数组之和的最大值

一个有N个整数元素的一维数组A[0],A[1],......,A[n-1],这个数组当然有很多子数组,那么子数组的最大值是什么呢? 分析与解法 我们先明确题意: 1. 题目说的子数组,是连续的: 2. 题目只需要求和,并不需要返回子数组的具体位置: 3. 数组中的元素是整数,所以数组可能包含有正整数.零.负整数: 4. 子数组不为空. 解法一:枚举 最简单的办法就是枚举所有的i和j,计算sum[i..j] = A[i]+A[i+1]+...+A[j],遍历所有可能的sum[i..j],找到最大值

一维数组子数组最大和

题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 生成数组,生成子数组,求和,求最大值. 代码: package bao; import java.util.*; public class Msum { public static void main(String args[]) { Scanne

联通子数组(一)

本次实验任务: 思路分析: 将二维拆分为一维,先求得每一行的最大子数组的和,并且求得每一行最大子数组的起始元素和终止元素,与其他行的进行比较,检查是否联通,若联通,则将两行的子数组最大值和相加,找出不同行子数组最大值求和的最大值即为所求 已实现的代码: 1 #include<iostream> 2 #include<ctime> 3 int max_(int j, int *array, int &first, int &last); 4 using namespa

联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来; 返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.下面是给的示例图: 最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了. 我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的

lintcode循环数组之连续子数组求和

v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. v 样例 给定 [3, 1, -100, -3, 4], 返回 [4,0]. v 思路 1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间.从左边开始一直累加,并初始当前区间[ld

lintcode 中等题:continuous subarray sum 联系子数组之和

题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, 1, 3, -3, 4], 返回[1,4]. 解题 法一:直接暴力,时间复杂度O(N2),时间超时 public class Solution { /** * @param A an integer array * @return A list of integers includes the i