zoukankan      html  css  js  c++  java
  • 连续子数组的最大和

    第一种方法:

    此种方法的思想较为简单:先找出从第1个元素开始的最大子数组,而后再从第2个元素开始找出

    从第2个元素开始的最大子数组,依次类推,比较得出最大的子数组。

     1 import java.util.Scanner;
     2 public class Main{
     3     public static void main(String[] args){
     4         Scanner in = new Scanner(System.in);    
     5         int num = in.nextInt();
     6         int arr[] = new int[num];
     7         for(int i=0;i<num;i++){
     8             arr[i] = in.nextInt();
     9         }
    10         int maxsum = arr[0];
    11         for(int i=0;i<num;i++){
    12             int currsum = 0;
    13             for(int j=i;j<num;j++){
    14                 currsum += arr[j];
    15                 if(currsum>maxsum){
    16                     maxsum = currsum;
    17                 }
    18             }
    19         }
    20         System.out.println(maxsum);
    21     }
    22 }

    此种方法的时间复杂度为O(n*n),在OJ上运行时会显示:没有在规定的时间内运行完成。即说明,没有通过,太低级了!!哈哈

    第二种方法:

    分两种情况  a)当数组中所有元素都是负数是,此问题变成了找数组的最大值;b)当数组中的元素不全为负数时,和最大子数组的第一个元素一定是正数,且子数组的和一定大于0,

     1 import java.util.Scanner;
     2 public class Main{
     3     public static void main(String[] args){
     4         Scanner in  = new Scanner(System.in);
     5         int num = in.nextInt();
     6         int arr[]  = new int[num];
     7         boolean flag = true;
     8         for(int i=0;i<num;i++){
     9             arr[i] = in.nextInt();
    10         }
    11         for(int i=0;i<num;i++){
    12             if(arr[i]>=0){
    13                 flag = false;    //arr[]存在大于或等于0的数
    14             }
    15         }
    16         int i,j;  
    17         int MaxSum = 0;  
    18         int CurSum = 0;
    19         if(flag == false){    
    20               
    21             for(i=0;i<num;i++)  
    22             {  
    23                 CurSum += arr[i];  
    24                 if(CurSum > MaxSum)  
    25                     MaxSum = CurSum;  
    26                 if(CurSum < 0)  
    27                     CurSum = 0;  
    28             }  
    29             System.out.println(MaxSum);
    30         }
    31         if(flag == true){    //arr[]中的元素全部小于0
    32             MaxSum = arr[0];
    33             for(j=0;j<num;j++){
    34                 if(arr[j]>MaxSum){
    35                     MaxSum = arr[j];
    36                 }
    37             }
    38             System.out.println(MaxSum);
    39         }
    40     }
    41 }
  • 相关阅读:
    ARM学习笔记10——GNU ARM命令行工具
    ARM学习笔记9——ARM汇编汇编语言中的伪指令
    ARM学习笔记8——通用寄存器和存储器内容交换指令和软中断指令
    ARM学习笔记7——乘法指令
    ARM学习笔记6——程序状态寄存器访问指令
    ARM学习笔记5——程序状态寄存器
    ARM学习笔记4——加载存储指令
    ARM学习笔记3——数据处理指令
    ARM学习笔记2——分支跳转指令
    ARM学习笔记1——Arm寄存器与模式的关系
  • 原文地址:https://www.cnblogs.com/XuGuobao/p/7340889.html
Copyright © 2011-2022 走看看