您的位置:首页 > 其它

零子数组

2016-07-15 20:30 211 查看

题目:

长度为N的数组A中子数组和最接近0的子数组。

思路:

对于一个数组A,其子数组和最接近0只会出现在两种情况中:

数组下标从 0 到 i 中

数组下标从 i 到 j 中

(其中 i,j均小于数组长度)

如何做?

对于第一种情况,只需要求出数组A从0带A.length所有前i项和,然后找出最小的。

对于第二种情况,先求出 1 中所有前i项和,然后从小到大排序,最后将排序后的前i项和两两相减,取差值最小的

最后取 1 和2 两种情况中最小者返回即可

代码:

public class 零子数组 {
public static void main(String[] args) {
int[] array = { 1, -2, 3, 10, -4, 7, 2, -5 };
// 1.s[0...i] 子数组和最接近于0
int[] s1 = f1(array);
// 2.s[i...j] 子数组和最接近于0
int res = f2(s1);
System.out.println("\n结果:\n" + res);
}

private static int f2(int[] s1) {
int min = s1[0];
for (int i = 1; i < s1.length; i++) {

int s = s1[i] - s1[i - 1];
if (Math.abs(min) > Math.abs(s)) {
min = s;
}
}
return min;
}

private static int[] f1(int[] array) {
int[] s = new int[array.length];
s[0] = array[0];
for (int i = 1; i < array.length; i++) {
s[i] = s[i - 1] + array[i];
}
System.out.println("排序前:");
for (int i = 0; i < s.length; i++) {
System.out.print(s[i] + " ");
}
return order(s);
}

// 排序
private static int[] order(int[] s) {
for (int i = 0; i < s.length; i++) {
for (int j = i; j < s.length; j++) {
if (s[i] > s[j]) {
int a = s[i];
s[i] = s[j];
s[j] = a;
}
}
}
System.out.println("\n排序后:");
for (int i = 0; i < s.length; i++) {
System.out.print(s[i] + " ");
}
System.out.println();
return s;
}
}


结果:

排序前:

1 -1 2 12 8 15 17 12

排序后:

-1 1 2 8 12 12 15 17

结果:

0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  子数组 和最接近0