2

样本输入= 10 -20 -3916237 -357920 -3620601 7374819 -7330761 30 6246457 -6461594 266854

样本输出 = -20 30

在此先感谢我是编程初学者

class Main {
    public static void main(String[] args) {
       int _a_size = Integer.parseInt(args[0]);
       Assert.assert2(args.length,_a_size+1);
       int[] _a = new int[_a_size];
       for(int _a_i = 0;_a_i<_a_size;_a_i++) {
          _a[_a_i] = Integer.parseInt(args[_a_i+1]);
       } 
       Operation.minDiffrence (_a);
    }
}
4

2 回答 2

2

你可以做

public static List<int[]> minDifference(int[] values) {
    Arrays.sort(values); // O(N log N)
    List<int[]> results = new ArrayList<>();
    long minDiff = Long.MAX_VALUE;
    for(int i = 0; i < values.length-1;i++) {
        long diff = Math.abs((long) values[i+1] - values[i]);
        if (diff < minDiff) {
            results.clear();
            minDiff = diff;
        }
        if (diff == minDiff)
            results.add(Array.copyOfRange(values, i, 2));
    }
    return results;
}

这样做的目的是保持所有迄今为止最短的结果,如果找到一个较短的结果,它会丢弃旧的结果。你会得到一个等分值对的列表。

注意:计算是long为了避免溢出。

于 2015-01-28T10:15:47.503 回答
0

我知道这是一个老问题,但这是一个有效的 Java 8 解决方案:

Map<Integer, List<List<Integer>>> map = list.stream().flatMap(i -> list.stream()
    .map(i2 -> (i.equals(i2) || i > i2) ? null : Arrays.asList(i, i2)))
    .filter(ints -> ints != null)
    .collect(Collectors.groupingBy(o -> Math.abs(o.get(1) - o.get(0))));

它在 SO 的代码显示中看起来有点难看,但在我的 IDE 中它非常适合 3 行。它返回一个映射,其中键是绝对差值,值是对应数字对的列表(因为可能不止一个)。

您可能不再需要它,但玩流媒体总是很有趣。

于 2017-02-09T02:37:01.653 回答