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.补充
我没有写关于全是负数的最大子串或值,因为只是一个负数找最大就可以了 添加一个判断就可以了。