精华内容
下载资源
问答
  • 学习之路不可停止,最近在玩C语言,自己也动手尝试写了些实例,下面爱站小编给各位分享C语言中求子数组最大和的实现,在这个过程里面,或许能增长见识,一切都归于我们的心态与行动。题目:输入一个整形数组数组里...

    学习之路不可停止,最近在玩C语言,自己也动手尝试写了些实例,下面爱站小编给各位分享C语言中求子数组最大和的实现,在这个过程里面,或许能增长见识,一切都归于我们的心态与行动。

    题目:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,

    因此输出为该子数组的和18。

    找到状态转移方程,dp[i]表示前i个数中,包含i的子数组的最大和。要么第i个数自己最大,要么他要和包含i-1的子数组最大和(即dp[i-1])联合在一起.

    即dp[i] = max{arr[i],dp[i-1]+arr[i]};

    代码如下;

    #include #define max(a,b) (a)>(b)?(a):(b)

    int res(int* arr, int len){

    //学到一个定义最小数的方法:)

    int max = -(1

    int i;

    for(i=1;i

    arr[i] = max(arr[i],arr[i-1]+arr[i]);

    if(max

    }

    return max;

    }

    int main(){

    int arr[] = {1,-2,3,10,-4,7,2,-5};

    printf("%d\n",res(arr,8));

    return 0;

    }

    以上就是C语言中求子数组最大和的实现,如果有哪些地方还不清楚可以留言给我,如果觉得我写得不错的话,请继续关注爱站技术频道,谢谢!

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

    /*

    *

    * 求子数组的最大和(数组)

    题目:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,

    因此输出为该子数组的和18

    本题目采用动态规划的思想。

    求对大子序列必然是一个正序列+序列的情况。当某子序列和为0时,清空临时子序列和,即下面的temp=0;

    当前子序列大于max子序列时,max=temp

    */

    package cn.edu.cqupt.mircrosoft100;

    public class MaxSubsequence {

    public static int getMaxSubsequence(int []array)

    {

    int maxSum=0;

    int temp=0;

    int maxNum=array[0]; //处理整个数列都是负数的情况

    for(int i=0;i

    {

    if(maxNum

    maxNum=array[i];

    temp+=array[i];

    if(temp<=0)

    temp=0;

    if(temp>maxSum)

    maxSum=temp;

    }

    if(maxNum<0)

    return maxNum;

    return maxSum;

    }

    public static void main(String args[])

    {

    int array[]={1,-2,3,10,-4,7,2,-5};

    System.out.println(MaxSubsequence.getMaxSubsequence(array));

    }

    }

    展开全文
  • 通过这道题,你可以掌握如何根据用户输入创建数组如何在一连串数字中找到和最大的某一段连续数字子串如何发现问题的潜在规律并利用这个规律设计算法,解决问题 思路连续数相加要最大,说明左右两边的数肯定不是负数...

    上一篇解答了在栈里面求最小值元素的问题,这一篇,来聊聊怎么找到数组中子数组的最大和。

    通过这道题,你可以掌握

    如何根据用户输入创建数组

    如何在一连串数字中找到和最大的某一段连续数字子串

    如何发现问题的潜在规律并利用这个规律设计算法,解决问题

    0818b9ca8b590ca3270a3433284dd417.png

    思路

    连续数相加要最大,说明左右两边的数肯定不是负数,否则不可能最大

    连续数序列中允许存在负数,前提是负数前面的一段正数相加要大于这个负数,否则两者抵消后,和会变小

    算法

    遍历数组

    遇到正数,

    不断累加,遇到的第一个正数要记录下标

    遇到负数,

    记录下标,把此下标减1和之前记录的正数的下标之间的数组作为一个可能最大数组,

    与之前的可能最大数组比较,若变大,则取代!

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    源代码

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    /**

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为 O(n)。

    例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,

    因此输出为该子数组的和 18。

    思路

    连续数相加要最大,说明左右两边的数肯定不是负数

    连续数序列中允许存在负数,前提是负数前面的一段正数相加要大于这个负数

    算法:

    遍历数组

    遇到正数,不断累加,遇到的第一个正数要记录下标

    遇到负数,记录下标,

    把此下标减1和之前记录的正数的下标之间的数组作为一个可能最大数组,

    与之前的可能最大数组比较,若变大,则取代!

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    */

    void main()

    {

    //根据用户输入创建数组

    vector oriArray;

    int n=0,count=0;

    string str;

    bool endFlag=true;

    while(endFlag){

    cout<

    cin>>str;

    if(str=="e"){

    endFlag=false;

    }else{

    stringstream(str)>> n;

    oriArray.push_back(n);

    count++;

    }

    }

    cout<

    for(int i =0;i

    cout<

    }

    //求最大子数组

    /**

    add:累加值

    ori:累加值的起始角标

    max:最大和

    maxOri:最大和子数组起始角标

    maxEnd:最大和子数组结尾角标

    */

    int add=0,ori=0,max=0,maxOri=0,maxEnd=0;

    bool firstPos=true;

    //遍历

    for(int i =0;i

    //遇到正数

    if(oriArray[i]>=0){

    add+=oriArray[i];//不断累加

    if(firstPos){//遇到的第一个正数要记录下标

    ori=i;

    firstPos=false;

    }

    }else{

    //遇到负数

    //之与前的可能最大和比较,若变大,则取代!

    if(add>max){

    max=add;

    maxOri=ori;

    maxEnd=i-1;

    }

    /**

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    */

    if(oriArray[i]+add>0){

    add+=oriArray[i];

    }else{

    add=0;

    if(i+1

    ori=i+1;

    }

    }

    }

    //跳出循环后再判断一次

    if(add>max){

    max=add;

    maxOri=ori;

    maxEnd=oriArray.size()-1;

    }

    cout<

    cout<

    cout<

    cout<

    for(int i=maxOri;i>=maxOri&&i<=maxEnd;i++){

    cout<

    }

    system("pause");

    }

    运行图

    0818b9ca8b590ca3270a3433284dd417.png

    此题的关键在于发现最大和子数组的两端不能是负数这个规律。

    做完之后在网上找了找类似的题目答案,发现有大神给出了更牛的解法,在此共享一下

    思路2:

    当前面的几个数,加起来后,b<0后,

    把 b 重新赋值,置为下一个元素,b=a[i]。

    当 b>sum,则更新 sum=b;

    若 b

    源代码2:

    #include

    #include

    #include

    #include

    using namespace std;

    /**

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为 O(n)。

    例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,

    因此输出为该子数组的和 18。

    思路

    当前面的几个数,加起来后,b<0后,

    把 b 重新赋值,置为下一个元素,b=a[i]。

    当 b>sum,则更新 sum=b;

    若 b

    */

    int maxSum(int* a, int n)

    {

    int sum=0;

    int b=0;

    for(int i=0; i

    {

    if(b<=0) //前面的几个数,加起来后,b<0

    b=a[i];//b 重新赋值

    else

    b+=a[i];//前面的几个数,加起来后,b>=0,继续累加

    if(sum

    sum=b;// b>sum,则更新 sum=b

    }

    return sum;

    }

    void main()

    {

    int a[10]={1,-8,6,3,-1,5,7,-2,0,1};

    cout<

    system("pause");

    }

    解法二之所以比解法一简练,在于他不仅仅意识到两端的数不能为负数,而且只要那一串的子数组相加小于0,就不可能是最大和子数组的一部分。

    每个问题都有其发生的规律,设计算法的过程就是发现规律并加以利用的过程。

    就好比打羽毛球,如果我发现只要我一回高远球,对手就放短球,那么我下次回完高远就直接冲到网前准备扑杀。

    展开全文
  • 通过这道题,你可以掌握如何根据用户输入创建数组如何在一连串数字中找到和最大的某一段连续数字子串如何发现问题的潜在规律并利用这个规律设计算法,解决问题思路连续数相加要最大,说明左右两边的数肯定不是负数,...

    上一篇解答了在栈里面求最小值元素的问题,这一篇,来聊聊怎么找到数组中子数组的最大和。

    通过这道题,你可以掌握

    如何根据用户输入创建数组

    如何在一连串数字中找到和最大的某一段连续数字子串

    如何发现问题的潜在规律并利用这个规律设计算法,解决问题

    8531fb35620bc296434e47a243cd9ff9.png

    思路

    连续数相加要最大,说明左右两边的数肯定不是负数,否则不可能最大

    连续数序列中允许存在负数,前提是负数前面的一段正数相加要大于这个负数,否则两者抵消后,和会变小

    算法

    遍历数组

    遇到正数,不断累加,遇到的第一个正数要记录下标

    遇到负数,记录下标,把此下标减1和之前记录的正数的下标之间的数组作为一个可能最大数组,

    与之前的可能最大数组比较,若变大,则取代!

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    源代码

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    /**

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为 O(n)。

    例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,

    因此输出为该子数组的和 18。

    思路

    连续数相加要最大,说明左右两边的数肯定不是负数

    连续数序列中允许存在负数,前提是负数前面的一段正数相加要大于这个负数

    算法:

    遍历数组

    遇到正数,不断累加,遇到的第一个正数要记录下标

    遇到负数,记录下标,

    把此下标减1和之前记录的正数的下标之间的数组作为一个可能最大数组,

    与之前的可能最大数组比较,若变大,则取代!

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    */

    void main()

    {

    //根据用户输入创建数组

    vector oriArray;

    int n=0,count=0;

    string str;

    bool endFlag=true;

    while(endFlag){

    cout<

    cin>>str;

    if(str=="e"){

    endFlag=false;

    }else{

    stringstream(str)>> n;

    oriArray.push_back(n);

    count++;

    }

    }

    cout<

    for(int i =0;i

    cout<

    }

    //求最大子数组

    /**

    add:累加值

    ori:累加值的起始角标

    max:最大和

    maxOri:最大和子数组起始角标

    maxEnd:最大和子数组结尾角标

    */

    int add=0,ori=0,max=0,maxOri=0,maxEnd=0;

    bool firstPos=true;

    //遍历

    for(int i =0;i

    //遇到正数

    if(oriArray[i]>=0){

    add+=oriArray[i];//不断累加

    if(firstPos){//遇到的第一个正数要记录下标

    ori=i;

    firstPos=false;

    }

    }else{

    //遇到负数

    //之与前的可能最大和比较,若变大,则取代!

    if(add>max){

    max=add;

    maxOri=ori;

    maxEnd=i-1;

    }

    /**

    判断累加的值与负数大小关系

    如果累加值大于负数,则继续累加

    如果累加值小于等于负数,舍弃此负数,向前移动,累加值清零

    */

    if(oriArray[i]+add>0){

    add+=oriArray[i];

    }else{

    add=0;

    if(i+1

    ori=i+1;

    }

    }

    }

    //跳出循环后再判断一次

    if(add>max){

    max=add;

    maxOri=ori;

    maxEnd=oriArray.size()-1;

    }

    cout<

    cout<

    cout<

    cout<

    for(int i=maxOri;i>=maxOri&&i<=maxEnd;i++){

    cout<

    }

    system("pause");

    }运行图

    1fc8c75292e1ba54879a50f3949a72c8.png

    此题的关键在于发现最大和子数组的两端不能是负数这个规律。

    做完之后在网上找了找类似的题目答案,发现有大神给出了更牛的解法,在此共享一下

    思路2:

    当前面的几个数,加起来后,b<0后,

    把 b 重新赋值,置为下一个元素,b=a[i]。

    当 b>sum,则更新 sum=b;

    若 b

    源代码2:

    #include

    #include

    #include

    #include

    using namespace std;

    /**

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为 O(n)。

    例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,

    因此输出为该子数组的和 18。

    思路

    当前面的几个数,加起来后,b<0后,

    把 b 重新赋值,置为下一个元素,b=a[i]。

    当 b>sum,则更新 sum=b;

    若 b

    */

    int maxSum(int* a, int n)

    {

    int sum=0;

    int b=0;

    for(int i=0; i

    {

    if(b<=0) //前面的几个数,加起来后,b<0

    b=a[i];//b 重新赋值

    else

    b+=a[i];//前面的几个数,加起来后,b>=0,继续累加

    if(sum

    sum=b;// b>sum,则更新 sum=b

    }

    return sum;

    }

    void main()

    {

    int a[10]={1,-8,6,3,-1,5,7,-2,0,1};

    cout<

    system("pause");

    }

    解法二之所以比解法一简练,在于他不仅仅意识到两端的数不能为负数,而且只要那一串的子数组相加小于0,就不可能是最大和子数组的一部分。

    每个问题都有其发生的规律,设计算法的过程就是发现规律并加以利用的过程。

    就好比打羽毛球,如果我发现只要我一回高远球,对手就放短球,那么我下次回完高远就直接冲到网前准备扑杀。

    原文:http://blog.csdn.net/hzy38324/article/details/45190117

    展开全文
  • ### @param num int整型一维数组# @return int整型二维数组#class Solution:def threeSum(self , num ):# write code herepackage main/**** @param num int整型一维数组* @return int整型二维数组*/func threeSum( ...
  • C语言数组中相邻元素持续相加,求其最大值!
  • 直接读取1.读取至a[0]和b[0],与'D'和'C'比较,就可以判断是借还是贷2.接着读取a[2] a[3] a[4] a[5] b[2] b[3] b[4] b[5]并强制转换为int型然后可以这样int temp1 = a[2]*1000+a[3]*100+a[4]*10+a[5];...
  • C语言数组

    2018-01-26 14:40:09
     在C语言数组的下标是从0开始,例如 : Int a[Max]; Max是编译时可知的值,它的元素是从a[0]到a[Max-1]; 2.数组后面第一个元素的地址是否可以使用:  数组后面第一个元素的地址可以使用但不可以查看。例如果写...
  • 一、指针数组和数组指针的内存布局初学者总是分不出指针数组数组指针的区别。其实很好理解:指针数组:首先它是一个数组数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。...
  • C语言——数组名、取数组首地址的区别(一)

    万次阅读 多人点赞 2017-03-26 20:57:41
    数组名array、&array的区别 3. array、&array的区别表现在什么地方 4. 讨论 5. 参考 1.开篇 很多博客和贴吧都有讨论这个话题,各有自己的表述方式,今天在他们的基础上我将继续试着以我自己理解的方式...
  • C语言实现个超大数组相加

    千次阅读 2018-03-29 00:19:41
    //任意个一百位以上的整数相加;//用字符串存储,数组输入相加后的和并输出;//由于不知道相加后的结果,而且数组没办法提前知道所得结果的长度,所以需要将数组设置的尽量大;#include&lt;stdio.h&gt; #...
  • C语言中只有一维数组,而且数组的大小必须在编译期就作为一 个常数确定下来。不过,C语言数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真"出一个多维数组就不是一件难事。 对于一个...
  • C语言数组

    2016-11-20 23:56:45
    1.C语言数组的概念 下面是输出一个 4×4 的整数矩阵,代码如下: #include #include int main(){ int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4...
  • 高维数组 如二维数组: int a[10][20] 指针数组 元素为指针的数组,如:int* p[n],p是一个数组数组中元素为int*,且有n个元素。 数组指针(行指针) 指向数组的指针,如:int (*p)[n],p是一个指针,指向数组的...
  • 指针数组:首先它是一个数组数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的...
  • C语言指针数组和数组指针--精讲

    千次阅读 多人点赞 2019-03-10 17:12:01
    指针数组:首先它是一个数组数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的...
  • 1.开篇 很多博客和贴吧都有讨论这个话题,各有自己的表述方式,今天在他们的基础上我将继续试着以我自己理解的方式总结一下,欢迎大家...array是整个数组array的首地址,array是数组首元素的首地址(和&array[0...
  • C语言_数组

    2014-10-20 20:36:59
    数组
  • C语言中得数组详解

    2014-12-10 16:05:52
    C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 ...
  • C语言入门(16)——C语言数组

    千次阅读 多人点赞 2014-06-30 12:26:39
    C语言支持一维数组和多维数组。如果一个数组的所有元素都不是数组,那么该数组称为一维数组。 一维数组的定义方式 在C语言中使用数组必须先进行定义。一维数组的定义方式为: 类型说明符 数组名 [常量表达式];...
  • 巧用c语言数组部分元素初始化

    千次阅读 2016-02-29 17:16:08
    让我们回想一下当初学习c语言数组模块:数组(array)由一些类型相同的元素构成。当我们只是声明数组(int a[10];//声明了含有10个int类型元素的数组)没有初始化时,其实就和声明普通变量(int a;)一样,存储的...
  • 一、指针数组和数组指针的内存布局初学者总是分不出指针数组数组指针的区别。其实很好理解:指针数组:首先它是一个数组数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。...
  • C语言指针数组和数组指针 作者:admin 发布时间:2012-04-19 13:09 来源:C语言中文网 人围观 一、指针数组和数组指针的内存布局 初学者总是分不出指针数组数组指针的区别。其实很好理解: 指针数组:首先它是一个...
  • 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维...
  • C语言数组

    千次阅读 2006-10-07 15:24:00
    C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。...
  • C语言多维数组,结构体解析

    千次阅读 2018-06-22 20:54:10
    首先讲解一个误区int a[5] = {0}; printf("a : %d\n", a); printf("&amp;a : %d\n"...我们都知道a代表数组的首地址,&...a也是数组的地址,所以它们输出的结果是一样的,那么为什么a+
  • 前期C语言回顾 数组

    2014-11-12 14:02:25
    数组:相同数据类型的成员组成的一组数据  * 数组是一种构造类型,相同数据类型组成的新数据类型。  * 数组的每一个成员成为一个数组元素。   // 一维数组的定义 // 数组类型 数组名[常量...
  • c语言引用数组元素时其数组下标的允许的数据类型是什么发布时间:2020-07-30 11:56:52来源:亿速云阅读:621作者:Leahc语言引用数组元素时其数组下标的允许的数据类型是什么?很多新手对此不是很清楚,为了帮助大家...
  • C语言数组与指针)

    2016-09-05 12:51:01
    地址做加法与整数做加法是有区别的,地址做加法时,是以地址的类型大小为单位进行相加的。 以int arr[5]为例,arr 代表了int 类型元素的地址,由于int 类型占用4 个字节,那么,arr 加1,实际上是数值增加的是4,...
  • C语言:数组求和例题!

    2021-06-20 23:03:39
    问题1:.编程求[10,100]之间能被2或3或5整除的数之和。 代码: #include <stdio.h> int main() { int a = 0 , b = 0 , c = 0 , sum; for(int i = 10 ; i <= 100 ;... if(i % 3 == 0){

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,556
精华内容 7,422
关键字:

c语言两数组相加

c语言 订阅