零子数组
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
相关文章推荐
- 求一个数组的子数组的最大和
- 求子数组的最大和
- [编程之美] PSet2.14 求数组的子数组之和的最大值
- 求一个矩阵中最大的二维矩阵(元素和最大)
- 一道很火的面试题:求子数组的最大和
- 算法习题4:求子数组的最大和
- 编程之美-子数组的最大乘机方法整理
- 编程之美-求数组的子数组之和的最大值方法整理
- 编程之美-子数组之和的最大值(二维)方法整理
- 编程之美-求数组中最长递增子序列(LIS)方法整理
- 剑指offer(27)-连续子数组的最大和
- 连续子数组最大和
- 算法导论 - 最大和连续子数组
- 求子数组的最大和
- 剑指offer 连续子数组的最大和
- 微软面试题系列(三):求子数组的最大和
- Leetcode 53. Maximum SubarrayJAVA语言
- 子数组
- 最大值减去最小值小于或等于num的子数组数量
- CF-Educational Codeforces Round 15-A-Maximum Increase