课堂练习
解题思路:从头到尾逐个累加数组中的每个数字,初始化和为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; } }
运行截图: