[アルゴリズム-Javaの実装]連続するサブ配列の最大累積合計を見つける
1.問題の説明:
1.入力:データのセットである文字列を入力します。各データは「、」で区切られます。(つまり、Stringタイプの文字列を入力し、Stringクラスのsplit()メソッドを使用してその文字列をStringタイプの配列に変換します)。
2.出力:このアレイのサブアレイの最大累積合計を出力します。
2.質問の回答:
1.配列が空の場合、または配列の長さが0の場合は、0を直接返します。
2.入力配列のデータに{-6、-2、-3、-5}のように正の数がない場合、最大累積合計は配列の最大値、つまり-2になります。
2.アイデア:max = Integer.MIN_VALUEを初期化し(Math.max()を呼び出すときに、配列の最初の要素の値が現在の最大累積合計に設定されるようにします)、配列を順番にトラバースし、currentを使用して現在の配列の最大累積合計を記録します。current <0の場合、currentを0に設定します。current> 0の場合、各累積が最大累積合計になる可能性があることを意味します。その中で、アレイがトラバースされるたびに、maxが追跡に使用され、Math.max()メソッドがcurrentとmaxの最大値を取得するために使用され、maxがループの最後に返されます。
3.アルゴリズム分析:
1.時間の複雑さはO(N)であり、余分なスペースの複雑さはO(1)です。
2.2。予防:Int max = Integer.MIN_VALUEこのステップは非常に重要です。0に初期化すると、問題が発生します。たとえば、入力がすべて負の数値{-6、-2、-3、-5}(上記と同じ)の場合、-2ではなく0を返します。
JDKでは、整数型の範囲は-2147483648〜2147483647(-2 ^ 31-2 ^ 31-1)です。
最大値はInteger.MAX_VALUE(2147483647)であり、最小値はInteger.MIN_VALUE(-2147483648)です。
コードは以下のように表示されます
import java.util.*;
public class Solution {
/**
* 求连续子数组的最大和
* @param array string字符串一维数组 数组
* @return int整型
*/
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str=in.nextLine();
String[] array=str.split(",");
int result=findGreatestSumOfSubArray (array);
System.out.println(result);
}
public static int findGreatestSumOfSubArray (String[] array) {
//数组为空或数组的长度为0
if(array==null||array.length==0) {
return 0;
}
int max=Integer.MIN_VALUE;
int current=0;
for(int i=0;i<array.length;i++) {
current+=Integer.valueOf(array[i].toString());
max=Math.max(max, current);
current=current<0?0:current;
}
return max;
}
}