演算法---O(n)級求最大子列,或最大子列值
阿新 • • 發佈:2019-02-04
1.給定陣列
int[] arr = {-2,-4,-7,-20,1,1,1,1,-10,1,1,1,5,-10,10,10,10,-25,10,10,10,10,10,10,-300};
2.思考
如何才能最優效能的來求出最大子列或最大子列值呢(經過一次遍歷)
首先思考陣列最關鍵的是什麼,0,所有的數都是比0大,或者比0小,說明0是一個關鍵的判斷點
定義一個 中間變數 num =0 定義一個 和變數 sum;sum的作用是記錄子串和用的
首先拿出陣列的第一個數,把陣列的第一個數賦值給 num、以次類推。如果可以通行的話就加和
還有一個重要的點就是 sum值一定要大於0;把握住這些就可以了,還有分割思維,要將自己的思維
分割開,這個就需要長時間的聯絡了
3.程式碼
3.1用List儲存子串
package java0709; import java.util.List; import java.util.ArrayList; public class Maxnum { public static void main(String[] args) { int[] arr = {-2,-4,-7,-20,1,1,1,1,-10,1,1,1,5,-10,10,10,10,-25,10,10,10,10,10,10,-300 }; MaxNum(arr); } //O(n)級; public static void MaxNum(int[] arr) { int Maxnum = 0; int valuenum = 0; int Maxvalue =0; ArrayList<Integer> list =new ArrayList<Integer>(); ArrayList<String> list2 =new ArrayList<String>(); for (int i = 0; i < arr.length; i++) { Maxnum = arr[i]; list.add(arr[i]); Maxvalue = valuenum; valuenum = valuenum + Maxnum; if (Maxvalue > 0 && valuenum<0) { list.remove(list.size()-1); } list2 = (ArrayList<String>) list.clone(); if (valuenum < 0) { Maxnum =0; valuenum = 0; list.clear(); } } System.out.println(list2); }
3.2輸出最大值
public static int Maxint(int arr[]) { int Maxnum = arr[0]; int ValueNum = arr[0]; if (arr[0]<=0) { //Maxnum =0; ValueNum =0; } for(int i = 1;i<arr.length;i++) { ValueNum = ValueNum + arr[i]; if (ValueNum > Maxnum) { Maxnum = ValueNum; } if (ValueNum<0) { ValueNum =0; } } return Maxnum; }
3.3用String來儲存子串
public static String MaxSonString(int arr[]) {
int Maxnum = arr[0];
int ValueNum = arr[0];
String MaxString ="-2";
String ValueNumString ="";
if (arr[0]<=0) {
//Maxnum =0;
ValueNum =0;
}
for(int i = 1;i<arr.length;i++) {
ValueNum = ValueNum + arr[i];
ValueNumString = ValueNumString + arr[i]+",";
if (ValueNum > Maxnum) {
Maxnum = ValueNum;
MaxString =ValueNumString;
}
if (ValueNum<0) {
ValueNum =0;
ValueNumString ="";
}
}
return MaxString;
}
4.結果
5.補充
我沒有寫關於全是負數的最大子串或值,因為只是一個負數找最大就可以了 新增一個判斷就可以了。