1.时间复杂度是O(n^2)
public static int minPosSubSum(int[] a) {
int thissum = 0;
int minsum = 0;
for(int i = 0 ; i < a.length ; i++){
if(a[i] > 0){
minsum = a[i];
break;
}
}
for (int i = 0; i < a.length; i++) {
for(int j = i ; j < a.length; j++){
thissum += a[j];
if(thissum >0){ //考虑的最小正子序列大于0
if(thissum < minsum){
minsum = thissum;
}
}
}
}
return minsum;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.时间复杂度为O(nlogn),复杂度和用到的快速排序是一个级别。
public static int minPosSubSum(int[] a) {
int thissum = 0;
int minsum = 0;
int [] subsum = new int[a.length];
subsum[0] = a[0];
for(int i = 1 ; i < subsum.length ; i++){
subsum[i] += subsum[i - 1] + a[i];
}
//排序 subsum数组
quickzSort(subsum, 0, subsum.length - 1);
minsum = subsum[0] > 0 ? subsum[0] : subsum[subsum.length -1];
for(int i = 1 ; i < a.length ; i++){
if(subsum[i] > subsum[i - 1]){
int temp = subsum[i] - subsum[i - 1];
if(temp > 0 && temp < minsum){//考虑的是大于0的子序列
minsum = temp;
}
}
}
return minsum;
}
public static int quick(int [] a,int low ,int high){
int temp = a[low];
while(low < high){
while(low < high && temp < a[high]) --high;
a[low] = a[high];
while(low < high && temp >= a[low]) ++low;
a[high] = a[low];
}
a[low] = temp;
return low;
}
public static void quickzSort(int[] a, int low,int high){
if(low < high){
int temp = quick(a, low, high);
quickzSort(a, low, temp-1);
quickzSort(a, temp + 1, high);
}
}