1.可以用类似 的算法做。
2.一般做法。
(注:任何关于子序列的和的都可以用这种思想)
1.计算出前i项和,sum[i],
2.因为“数组A第i到j项的和 = 数组前j项的和sum(j) - 数组前i项的和sum(i-1)”(所以有了前i项我数组sum[],就可以得到A数组的所有子序列了,A的子序列不是sum中的元素就是sum中的任意两个元素相减)
3.所以只需要:把所有子序列一分为二,其中一部分为sum中包含的元素记做 T1集合,另一部分为sum中任意两元素相减的集合记做T2集合。
1,定义S[-1] = 0,对sum[-1, 0,..., N-1]排序后计算相邻元素的差的绝对值(排过序之后,相邻元素的差一定比不相邻的小,所以T2集合中的其他元素是不需要计算和比较了的),记做m1。
2.找出T1集合(即sum)中的元素的绝对值最小的值,记做m2.
3.比较m1和m2,哪个小就是哪个了。
1 /** 2 * 零子算法-要求时间复杂度为nlogn 3 * @param a 4 * @return 5 */ 6 public static int T(int[] a){ 7 //创建sum数组,第i项为a数组的前i项和 8 Listsum=new ArrayList<>(a.length); 9 sum.add(a[0]);10 for(int i=1;i