精华内容
下载资源
问答
  • php数组之和

    2011-09-02 17:04:35
    100 ) [price] => 150 [supp] => 50 ) ) [1] => Array ( [2] => Array ( [num_rooms] => 2 [adults] => Array ( [0] => 1 [1] => 1 ) [children] => Array ...
  • 问题:数组A[0],A[1],...,A[n-1]首尾相连,也就是允许找到一段数字(A[i],...,A[n-1],A[0],...A[j] )使其最大。 求解思想:将其分成两类1.解没有跨越A[n-1]到A[0] 2.解跨过A[n-1]到A[0]。 接下来主要讲解...

    问题:数组A[0],A[1],...,A[n-1]首尾相连,也就是允许找到一段数字(A[i],...,A[n-1],A[0],...A[j] )使其和最大。

    求解思想:将其分成两类1.解没有跨越A[n-1]到A[0] 2.解跨过A[n-1]到A[0]。

    接下来主要讲解第二中情况,编程之美书上的第二中求解是错误的。举个例子:100   1  2  3   -90  2   1,按照书上的解法:从A[0]开始和最大段是A[0]....A[3],即100+1+2+3=106,j=3;以A[n-1]结尾的和最大段是A[0]...A[6],即100+1+2+3-90+2+1=19。i=0;j>i所以最大为19。其实最大的和为2+1+100+1+2+3=109;

    我们可以采用以下解法求解第二种情况:先求解A[0]...A[n-1]的和sum1,若A[0]....A[n-1]中有负数,则寻找A[0].....A[n-1]中最小的求和段(其肯定为负的)为sum2;然后sum1-sum2便得到第二中情况最大的求和。例如:刚才的例子,sum1=19,sum2=-90;所以最大的和为sum1-sum2=109。

    Beauty-2.14.cpp

    // Beauty-2.14-1.cpp : 定义控制台应用程序的入口点。
    //
    //编程之美—2.14扩展问题,一维数组首尾相连
    #include "stdafx.h"
    #include<iostream>
    #include<vector>
    using namespace std;
    //分两种情况:(1)没有跨越a[n-1]到a[0],原问题求解(2)跨越a[n-1]到a[0],则整体的和,去除a[1]到a[n-2]中最小的和(若跨越a[n-1]、a[0],
    //  a[1]到a[n-2]中最小的和一定为负数)
    void arrsum(vector<int> a)
    {
    	int n=a.size();
    	int thissum1=0,maxsum1=a[0],maxsum2=0;
    	int start1=0,en1=0;
    	bool flag;
    	for(int i=0;i<n;i++)
    	{
    		thissum1+=a[i];
    		if(thissum1>maxsum1)
    		{
    			maxsum1=thissum1;
    			en1=i;
    		}
    		if(thissum1<0)
    		{
    			thissum1=0;
    			if(i!=n-1)
    			start1=i+1;
    		}
    		maxsum2+=a[i];
    		if((i>0)&&(i<n-1)&&(a[i]<0))
    			flag=true;
    	}
    
    	//寻找a[1]到a[n-2]中最小的和
    	int thissum2=0,minsum2=0;
    	int start=1,en2=1,start2=1;
    	if(flag)
    	{
    	for(int i=1;i<n-1;i++)
    	{
    		thissum2+=a[i];
    		if(thissum2<minsum2)
    		{
    			minsum2=thissum2;
    			en2=i;
    			start2=start;
    		}
    		if(thissum2>0)
    		{
    			thissum2=0;
    			start=i+1;
    		}
    	}
    	}
    	maxsum2=maxsum2-minsum2;
    	if(maxsum2<maxsum1)
    	{
    	cout<<"Max1:"<<maxsum1<<endl;
    	cout<<"from "<<start1<<" to "<<en1<<endl;
    	}
      else
      {
    	cout<<"Max:"<<maxsum2<<endl;
    	cout<<"from "<<en2+1<<" to "<<start2-1<<endl;
    	}
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int N;
    	cout<<"Input N:"<<endl;
    	cin>>N;
    	vector<int> arr;
    	cout<<"Input numbers:"<<endl;
    	for(int i=0;i<N;i++)
    	{
    		int x;
    		cin>>x;
    		arr.push_back(x);
    	}
    	arrsum(arr);
    	return 0;
    }
    
    


     

     

    展开全文
  • 求数组的子数组之和的最大值 解法一: 遍历 #include #include int MaxSum(int* A, int n) { int maximum = -100; int sum = 0; int i = 0, j = 0, k = 0; for (i = 0; i ; i++) { for(j

    问题:

    求数组的子数组之和的最大值


    解法一:

    遍历

    #include <stdio.h>
    #include <stdlib.h>
    
    int MaxSum(int* A, int n)
    {
        int maximum = -100;
        int sum = 0;
        int i = 0, j = 0, k = 0;
        for (i = 0; i < n; i++)
        {
            for(j = i; j < n; j++)
            {
                for(k = i; k <= j; k++)
                {
                    sum += A[k];
                }
                if (sum > maximum)
                    maximum = sum;
            }
        }
        return maximum;
    }
    
    int main()
    {
        int array[] = {-9, -2, -3, -5, -3};
        printf("%d\n", MaxSum(array, 5));
        return 0;
    }
    



    解法二:

    分治法,考虑A[0]以及最大的一段数组(A[i],...,A[j])之间的关系。

    1. 当0=i=j,元素A[0]本身构成和最大的一段。

    2. 当0=i<j,和最大的一段以A[0]开始。

    3. 当0<i时,元素A[0]跟和最大的一段没有关系。

    #include <stdio.h>
    #include <stdlib.h>
    
    int max(int x, int y)
    {
        return (x > y) ? x :y;
    }
    
    int MaxSum(int* array, int n)
    {
        int nStart = 0;
        int aAll = 0;
        int i = 0;
        nStart = array[n-1];
        aAll = array[n-1];
        for (i = n-2; i >= 0; i--)
        {
            nStart = max(array[i], nStart + array[i]);
            aAll = max(nStart, aAll);
        }
        return aAll;
    }
    
    int main()
    {
        int array[] = {-9, -2, -3, -5, -3};
        printf("%d\n", MaxSum(array, 5));
        return 0;
    }
    


    展开全文
  • 求连续子数组之和的最大值:这个题很早前我就研究过了,百度实习面试的时候问了我一道类似的题目,就是给定两个数组和一个数,在两个数组中各取一个数,使其和为输入的值,也是该题目的一种变形,我上来就给出了一个...

    求连续子数组之和的最大值:这个题很早前我就研究过了,百度实习面试的时候问了我一道类似的题目,就是给定两个数组和一个数,在两个数组中各取一个数,使其和为输入的值,也是该题目的一种变形,我上来就给出了一个最优的算法。然后计算时间复杂度,接着就被问的更难了,三个数组。。。  OMG,然后我就晕了,应该先说一个O(n^3)的实现的。然后再优化,但目前我还没有想到合适的优化办法。


    以上题目如果有什么问题,自己百度吧,这个都太简单了,经典的题目了。今天我想聊一下题目的变种题。


    (变形一)给定一个向量,要查找总和最接近0的子向量,而不是具有最大总和的子向量,如果希望查找总和最接近某一个给定数t的子向量,结果又怎样?

    解答:首先针对0,先利用一下求子数组最大和的O(n^2)算法。

    (方法一)

    maxsofar=(最小值)

    for(i=0; i<n; i++)

           sum =0;

            for(j=i; j<n; j++)

                   sum += a[j];

                   maxsofar = max(maxsofar,sum);

    (方法二)

    cumarr[0]= a[0];

    for(i=; i<n; i++)

           cumarr[i] = cumarr[i-1] +a[i];

    max = 最小值;

    for(i=0; i<n; i++)

           for(j=i; j<n;j++)

                sum = cumarr[j] - cummarr[i-1];

                maxsofar = max( maxsofar,sum);

    我们利用方法二的思想。来解决 最接近0的情况

    current[0] = a[0];

    for(i=1; i<n; i++)

           current[i] = current [i-1]+a[i];

    sort(current);//将数组current 按照升序排序,排序的时候注意保存原始的位置号,怎么实现,定义一个结构体,一个记录i,一个记录和,最后按照和的大小排序就可以了

    扫描排序后的数组,计算相邻元素之间的差,取差的绝对值最小的两个元素 current[ i ],和current[ j ],  ( j > i )

     最后的子序列就是 a[i+1],a[i+2],..., a[j] 。

    对于最接近t的情况,则计算排序后数组中相邻两个元素之间的差值时,用绝对值和t比较就可以啦。

    OK了。   

    (变形二)

    收费公路由n个收费站之间的n-1段公路组成,每一段公路都有相关的使用费。如果在O(n)时间内驶过两个收费站,并且仅使用一个费用数组,或在固定的时间内路过两个收费站,并且使用一个具有O(n^2)个表项的表,那么给出两站之间的行驶费用很容易。请描述一个数据结构,该结构仅需要O(n)的空间,却可以在固定的时间内完成任意路段的费用计算。

    跟(变形一)的题目很接近吧。答案也非常的接近, 就是不用再排序了,当输入任意两个站 i  和 j 时,只需要计算 current[ j ] - current[ i-1] 就OK啦!

    (变形三)

    给定整数m,n 和实数向量 x[n] ,请找出使总和 x[i] +....+ x[i+m] 最接近0 的整数 i, (0<=i <n-m)

    思路同上,计算x[0]到x[i]的总和current[i],得到响亮current[0],current[1],current[2],...,current[n-1]

    然后找到 i -1,使得 current[i-1] 和current[i+m] 的和最接近 0。

    minnum= current[m];

    for(i=1; i<n-m; i++)

          plus = current[ i+m]-current[i-1];

          minnum = min (minnum, plus);

    (变形四)- 今年腾讯实习生的一道加试题

    给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:
    要求O(1)空间复杂度和O(n)的时间复杂度;
    除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);
    青铜程序(主流编程语言任选)实现并简单描述。

    思路:

    从后往前计算b:

    b[n-1]=1;

    b[n-2]=a[n-1]*1;

    b[n-3]=a[n-2]*b[n-2] = a[n-2]*a[n-1]*1;

    ...

    b[1]=a[2]*a[3]*a[4]*...*a[n-1];

    b[0]=a[1]*a[2]*a[3]*...*a[n-1];

    从前往后计算a,要改变a原来的值:(为了方便明白新数组与原数组的关系,新数组用A表示,但是说上我们并没有申请新的空间)

    A[0]=a[0];

    A[1]=a[1]*A[0]= a[0]*a[1];

    A[2]=a[2]*A[1] = a[0]*a[1]*a[2];

    ...

    A[n-2]=a[0]*a[1]*a[2]*...*a[n-2];

    A[n-1]=a[n-1];//不做处理了,因为用不到

    最后计算b的最终值

    for(i=1; i<n; i++)

         b[i]=b[i]*A[i-1];

    全部的代码为:

    b[n-1]=1;

    for(i=n-2; i>=0;i--)

          b[i]=b[i-1]*a[i];

    for(i=1; i<n-1;i++)

          a[i]=a[i]*a[i-1];

    for(i=1; i<n; i++)

          b[i]=b[i]*a[i-1];

    (变形之最-给定n*n的实数数组,需要求矩形子数组的最大总和,复杂度又是多少?)

    《编程之美》上有解答。可惜我还没有很熟练。











































    展开全文
  • 题目:输入一个整形数组数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个。...这个题目在编程100题及编程美上都有相应解答,下面贴上自己的完整代码 #incl

    题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

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

    这个题目在编程100题及编程之美上都有相应解答,下面贴上自己的完整代码

    #include <iostream>
    using namespace std;
    int MaxSum(int a[],int n){
    	int max=a[0];
    	int tmpMax=a[0];
    	for(int i=1;i<n;i++){
    		if(tmpMax<0)
    			tmpMax=0;
    		tmpMax+=a[i];
    		if(tmpMax>max)
    			max=tmpMax;
    	}
    	return max;
    }
    int main(){
    	int a[8]={1,-2,3,10,-4,7,2,-5};
    	int sumMaxSubArray=MaxSum(a,8);
    	cout<<sumMaxSubArray<<endl;
    }


    这个是编程之美上算法的完整实现

    #include <iostream>
    using namespace std;
    int MaxSum(int a[],int n){
    	int nStart=a[n-1];
    	int nAll=a[n-1];
    	for(int i=n-2;i>=0;i--){
    		if(nStart<0)
    			nStart=0;
    		nStart+=a[i];
    		if(nStart>nAll)
    			nAll=nStart;
    	}
    	return nAll;
    }
    int main(){
    	int a[8]={1,-2,3,10,-4,7,2,-5};
    	int sumMaxSubArray=MaxSum(a,8);
    	cout<<sumMaxSubArray<<endl;
    }



    展开全文
  • 所谓能交换,就是交换过后,两数组和之差比当前小。我设想了一个迭代算法,就是将当前的交换尝试,重复,直到没有一个值再能交换为止! 代码如下: 1 a = [170, 100, 5, 4, 3, 2, 1] 2 b = [101, 100, 15, 14...
  • 3.求子数组的最大数组) 题目: 输入一个整形数组数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个。 求所有子数组的最大值。要求时间复杂度为O(n)。 例如...
  • 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组最大。输出答案时,请分别返回第一个数字最后一个数字的值。如果多个答案,请返回其中任意一个。 v 样例 给定[3, 1, -100, -3, 4],...
  • 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] ...
  • 程序员面试100九 求子数组的最大
  • #define MAX 100 using namespace std; int A[MAX][MAX]; int PS[MAX][MAX]; //method1 /* 最直接的方法,当然是枚举每一个矩形区域,然后再求这个矩形区域中元素的。时间复杂度为O(N^2 * M^2 * Sum的时间...
  • 测试题目求整数数组的子数组之和的最大值。 题目分析首先是明确题目的目的:求最大值;其次是考虑子数组求和。这里将求最大值写成一个单独的函数。主函数未测试函数。这里用到了二重循环,时间复杂度为N^2. 源代码...
  • Go的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性。其它语言相比差异主要在声明初始化的写法上,下面是简单声明一个数组: var a [5]int fmt.Println(a[0]) ...
  • 解析:第6行定义了一个整型数组,是为了存放一百个未知的整型数据空间 第8行的for循环是为了将数组里的未知空间进行赋值 第10行第11行这两种表达不行,但运算结果相同。 最后打印结果 ...
  • 二维数组外围之和

    千次阅读 2016-11-25 22:39:18
    输入某个数组的行列值以及该数组的所有元素,然后求出数组的外围之和。(外围之和.C)   思路:外围之和 = 第一行和 + 最后一行和 + 中间每行的第一个元素 最后一个元素的和,这样就避免了重复,不需要删减了 ...
  • #define MAX 100 using namespace std;   int A[MAX][MAX]; int PS[MAX][MAX]; //method1 /* 最直接的方法,当然是枚举每一个矩形区域,然后再求这个矩形区域中元素的。时间复杂度为O(N^2 * M^2 * Sum的时间...
  • 求所有子数组的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的最大,为 6。 提示: 1 <= arr.length <= 10^5 -100 <= arr[i...
  • 数组 ...//定义一个大小100数组,没有初始化 int array[2]= {1,2};//定义长度为2的数组,并初始化 int array[20]= {1,2};//定义长度为20的数组,并初始化前两个 new动态创建:使用new分配一个数...
  • C语言之数组

    2021-04-03 10:40:11
    数组是数据的集合,1-100 数组的数据是同类型的 数组的地址的连续的 2.数组的定义 类型、数组名、数组大小 int array[100]; 3.数组的几种定义方式 没有初始化的数组 int array1[100]; //没有初始化的数组,仅仅...
  • 3.求子数组的最大 ...数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个。 求所有子数组的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大的子数组为3
  • 数组对于每一门编程语言都是重要的数据结构一,当然不同语言对数组的实现及处理也不尽相同。Java语言中提供的数组是用来存储固定大小的同类型元素。你可以声明一个数组变量,如 int[100] 来代替直接声明 100 个...
  • 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个。求所有子数组的最大值。要求时间复杂度为O(n)。  例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大的子数组为3, 10, -4, 7, 2,因此...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,675
精华内容 670
关键字:

数组之和100