数组中两个不同的数字,它们的总和等于给定值

时间:2015-06-08 17:28:23

标签: arrays algorithm

给定一个数组,我们知道它的大小和可以在其中的数字范围。找到数组中总和到给定值的两个元素。有一个经典版本的算法 O(n)作为时间的复杂度,O(K)作为使用哈希映射的空间的复杂性(K是整数的范围)。如果我们想要找到不同的元素,那么 总结到给定的数字(对于相同的元素,它不起作用).Plus,程序只是检查是否至少 一个组合,它不需要找到所有可能的组合。

2 个答案:

答案 0 :(得分:1)

BST应该有用。

  1. 将数组排序为BST。
  2. while(当前节点不是root,执行inorder遍历)
    • 对于当前节点,请检查:
    • 如果总和大于当前值
    • 如果数组中的项目满足总和标准
    • 使inorder中的下一项遍历当前节点
  3. 第1步是O(nlogn) 步骤2是O(n / 2logn)

答案 1 :(得分:0)

这是O(n)解决方案,用于查找与预期目标相加的第一对数组索引。解决方案将在找到前两个索引求和目标时停止,如果你需要所有加起来的对而不是使用int []结果,你可以使用ArrayList甚至是Map,处理完整的数组和用所有索引对返回它。有一个明显的假设是Map的hashcode函数非常好并且碰撞不多,因此map操作在O(1)时间内执行。

添加两个索引的值不相同的条件应该为您提供具有不同数字的解决方案。

import java.util.*;

public class Solution {

    public static void main(String[] args) {
        int[] array = new int[] {1,2,4,7,12,67,12,5,9,1,10};
        System.out.println(Arrays.toString(sum(array, 68)));
    }

    public static int[] sum(int[] array, int target) {
        int[] result = new int[2];
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        // n iterations
        for (int index = 0; index < array.length; index++) {
            // constant
            if (map.containsKey(target - array[index])
                   && array[index] != array[map.get(target - array[index])]) {
                result[1] = index;
                // constant
                result[0] = map.get(target - array[index]);
                return result;
            }
            // constant
            map.put(array[index], index);
        }
        return result;
    }
}