zoukankan      html  css  js  c++  java
  • C_求最大连续子序列和

    题目:

    输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:

    序列:-2 11 -4 13 -5 -2,则最大子序列和为20。

    序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。

    1.

     1 /*
     2     算法一:穷举法(3个for)
     3             时间复杂度:O(n^3)
     4 
     5 */
     6 #include <stdio.h>
     7 #include <malloc.h>
     8 
     9 int Max = 0;
    10 int find_max(int len, int arr[]){
    11     int i, j, k, sum;
    12     for(i=0; i<len; i++){
    13         for(j=i; j<len; j++){
    14             sum = 0;
    15             for(k=i; k<=j; k++){
    16                 sum += arr[k];
    17             }
    18             if(sum > Max){
    19                 Max = sum;
    20             }
    21         }
    22     }
    23     return Max;
    24 
    25 } 
    26 
    27 int main(){
    28     int i, len, *arr;
    29     printf("请输入数组的长度: ");
    30     scanf("%d",&len);
    31     arr = (int *)malloc(sizeof(int)*len);
    32     printf("请输入数组的值:");
    33     for(i=0; i<len; i++){
    34         scanf("%d",&arr[i]);
    35     }
    36     find_max(len,arr);
    37     printf("最大连续子序列和 :%d
    ", Max );
    38     
    39     return 0;
    40 }

    2.

     1 /*
     2     算法二:算法一的优化 (2个for)
     3             时间复杂度:O(n^2)
     4 */
     5 #include <stdio.h>
     6 #include <malloc.h>
     7 
     8 int Max = 0;
     9 int find_max(int arr[],int n, int len){
    10       int i, sum = 0;
    11     for(i=n; i<len; i++){
    12         sum += arr[i];
    13         if(sum > Max){
    14             Max = sum ;    
    15         }
    16     }
    17     return Max;
    18 } 
    19 
    20 int main(){
    21     int i, len,  *arr;
    22     printf("请输入数组的长度:");
    23     scanf("%d",&len);
    24     arr = (int *)malloc(sizeof(int)*len);
    25     printf("请输入数组的值:");
    26     for (i=0; i<len; i++)
    27     {
    28         scanf("%d", &arr[i]);
    29     }
    30 
    31     
    32     for(i=0; i<10; i++){
    33        find_max(arr,i, len);
    34     }
    35         
    36     printf("最大连续子序列和:%d 
    ",Max);
    37 
    38     return 0;
    39 }

     将代码进行以下修改,可以得到该最大子序列和的开始元素和结束元素(low,high)

     1 int find_max(int len, int arr[]){
     2     int i, j, sum, low, high;
     3     for(i=0; i<len; i++){
     4         sum = 0;
     5         for(j=i; j<len; j++){
     6             sum += arr[j];
     7             if(sum > Max){
     8                 Max = sum;
     9                 low = i;
    10                 high = j;
    11             }
    12         }
    13     }
    14     printf("The low is :%d
    The high is : %d
    ",arr[low],arr[high]);
    15     return Max;
    16 }

    3.

     1 /*
     2     算法三:联机算法
     3     时间复杂度:O(n)
     4 */
     5 #include <stdio.h>
     6 #include <malloc.h>
     7 
     8 int Max = 0;
     9 int find_max(int len, int arr[])
    10 {
    11     int i, sum = 0;
    12     for(i=0; i<len; i++)
    13     {
    14         sum += arr[i];
    15         if(sum  > Max)
    16         {
    17             Max = sum;
    18         }else if(sum < 0){
    19             sum = 0;
    20         }    
    21     }
    22 
    23     return Max;
    24 }
    25 
    26 int main(){
    27     int i, len, *arr;
    28     printf("请输入数组的长度:");
    29     scanf("%d",&len);
    30     arr = (int *)malloc(sizeof(int)*len);
    31     printf("请输入数组的值:");
    32     for (i=0; i<len; i++)
    33     {
    34         scanf("%d", &arr[i]);
    35     }
    36     find_max(len, arr);
    37     printf("最大连续子序列和:%d 
    ",Max);
    38     return 0;
    39 }

    对以上代码进行小的改动,通过生成一系列的随机数进行测试程序运行的时间,由于程序运行的很快,需要通过重复循环取平均值的方法得到程序执行一次的时间。参考:http://www.cnblogs.com/LinSL/p/7475001.html

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <malloc.h>
     4 #include <time.h>
     5 
     6 clock_t start,stop;
     7 double duration;
     8 
     9 void fun(int len,int arr[]);
    10 
    11 int main(){
    12     int len, *arr, i;
    13     printf("Please enter the len:");
    14     scanf("%d",&len);
    15     arr = (int*)malloc(sizeof(int)*len);17     for(i=0; i<len; i++){
    16         arr[i] = rand()%2001-1000;/*产生-1000~1000之间的随机数*/
    17         printf("%d ",arr[i]);
    18     }
    19     printf("
    ");
    20     start = clock();
    21     fun(len,arr);
    22     stop = clock();
    23     duration = ((double)(stop - start))/CLK_TCK;
    24     printf("The duration is:%f
    ",duration);/*0.0000*/
    25     return 0;
    26 }
    27 
    28 void fun(int len,int arr[]){
    29     int max=0,
    30         sum=0,
    31         i;
    32     for(i=0; i<len; i++){
    33         sum += arr[i];
    34         if(sum > max){
    35             max = sum;
    36         }else if(sum < 0){
    37             sum = 0;
    38         }
    39     }
    40     printf("The max_sum is:%d
    ",max);
    41 }

    参考:http://blog.163.com/kevinlee_2010/blog/static/169820820201010495438247/

  • 相关阅读:
    active learning
    PLS-00201: identifier 'SYS.DBMS_CUBE_EXP' must be declared
    浅谈防火墙
    yum安装nginx错误处理
    简单的SQL注入
    mysql之查询语句练习题
    Linux权限和用户管理
    Linux文件及目录查找命令~~续集
    linux文件及目录查找命令
    linux文件管理练习题
  • 原文地址:https://www.cnblogs.com/LinSL/p/7412489.html
Copyright © 2011-2022 走看看