课堂练习

解题思路:从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestNum=int.MinValue)定义两个变量:“累加子数组和”和“最大子数组和”,第一步把数组中的第一个数字赋值给他们,然后从第二个数字开始累加,累加值放入“累加子数组和”。

       1.如果当前“累加子数组和”小于0,那抛弃前面的“累加子数组和”,从下一个数字开始重新累加,“最大子数组和”的值不更新。

       2.如果当前“累加子数组和”大于0,再让当前“累加子数组和”和当前的“最大子数组和”进行比较。

       3,如果当前“累加子数组和”大于当前“最大子数组和”,则更新“最大子数组和”的值为“累加子数组和”的值。

       4,如果当前“累加子数组和”小于当前“最大子数组和”,“最大子数组和”的值不更新。

      5.再加入数组中的下一个值,“累加子数组和”进入下一轮的累加,“最大子数组和”也进入下一轮的更新。直到数组中所有值都累加完毕。

//20173522 李秦
package com.pre.lq;
import java.util.Scanner;
public class Solution 
{
     
   public static void main(String[] args)
    {
       System.out.println("请输入数组中数字的个数:");
       int n=0;
       Scanner input=new Scanner(System.in);
       n=input.nextInt();
        int[] array =new int[n];
        System.out.println("请输入"+n+"个数:");
        for (int i = 0; i < array.length; i++) 
        {
            array[i]=input.nextInt();    
        }
        
        int result =  FindGreatestSumOfSubArray(array);
       
        System.out.println("连续子数组的最大和为:"+result);
 
    }
 
    public static int FindGreatestSumOfSubArray(int[] array) 
    {
           int len = array.length;
           if (len == 0)
           {
            return 0;
           }
           int currentsum = array[0];
           int greatsetsum = array[0];
           System.out.println("第1步:累加子数组和:"+currentsum+",最大子数组和:"+greatsetsum);
           for(int i=1;i<array.length;i++)
           {
               Long begintime = System.nanoTime();  
                if(currentsum > 0)
                {
                    currentsum += array[i];
                }
                else
                {
                    currentsum = array[i];
                }
                if(currentsum > greatsetsum)
                {
                    greatsetsum  = currentsum;
                }
               System.out.println("第"+(i+1)+"步:累加子数组和:"+currentsum+",最大子数组和:"+greatsetsum);
               try{
                    Thread thread = Thread.currentThread();
                    thread.sleep(1500);          //暂停1.5秒后程序继续执行
                }catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               Long endtime = System.nanoTime();      //返回值表示从某一固定但任意的时间算起的毫微秒,此方法只能用于测量已过的时间。
System.out.println("运行时间:"+(endtime - begintime) + "ns"); } return greatsetsum; } }

 运行截图:

 

posted on 2019-04-25 19:50  不愧下学  阅读(221)  评论(0编辑  收藏  举报

导航