package 程序测试专用;
/*
* 最小子序列,分治算法
*/
import java.util.Arrays;
public class MinseqSum {
public static int Minsum(int []a,int left,int right){
int MinLeftSum,MinRightSum;
int leftBorder,rightBorder;//temporary val to store left and right sum ogf substring
int MinLeftBorderSum,MinRightBorderSum;//smallest substring left and right to count <span style="font-family: Arial, Helvetica, sans-serif;">MinLeftSum,MinRightSum;</span>
if(left>=right) return a[left]<0?a[left]:0;
int mid = (left+right)/2;
MinLeftSum = Minsum(a,left,mid);
MinRightSum = Minsum(a,mid+1,right);
MinLeftBorderSum = leftBorder = 0;
for(int i=left;i<=mid;i++){
leftBorder += a[i];
if(leftBorder<MinLeftBorderSum)MinLeftBorderSum = leftBorder;
}
MinRightBorderSum = rightBorder = 0;
for(int i=mid+1;i<=right;i++){
rightBorder += a[i];
if(rightBorder<MinRightBorderSum)MinRightBorderSum = rightBorder;
}
return min3(MinLeftSum,MinRightSum,MinLeftBorderSum+MinRightBorderSum);//the smallest among the three
}
public static int min3(int x, int y, int z){
if(x<y&&x<z) return x;
if(y<x&&y<z) return y;
return z;
}
public static void main(String[] args){
int [] a = new int[10];
for(int i=0;i<10;i++){
a[i] = (int) (Math.random()*(i%2==0?-i:i));
}
System.out.println(Arrays.toString(a));
System.out.println(Minsum(a,0,a.length-1));
}
}
最小子序列--分治算法
最新推荐文章于 2023-03-03 15:55:29 发布