两个数字的总和等于给定的数字

时间:2015-04-28 09:02:35

标签: java arrays performance algorithm sorting

  

我有一个随机顺序的正整数数组。数字 x   从列表中给出,我们需要在列表中找到任意两个数字   总和等于 x 。运行时间必须小于n ^ 2.

{编辑} 我所做的是,我把所有数字都放在一个数组中不到x的一半,而在另一个数组中放入大于x的一半,并且丢弃所有大于x的数字,然后想法是必须从两个数组中得到两个数字(不是来自单个数组)并通过迭代我可以得到两个数字。

现在对于最坏的情况,我有点困惑的是,方法是好的吗?或者,如果有人指导我比这更好的东西,我们还可以实现 log n n * log n 吗?

5 个答案:

答案 0 :(得分:8)

你的解决方案都错了,并在O(n^2)

  1. 考虑x=5arr=[1,2,3,5]这是错误的 - 所需的两个数字来自一个数组,而不是两个数组。
    如果arr=[3,3,6]x=6,您将两个3放在一个列表中(例如,不大于x/2),将会找不到{ {1}}。
  2. 您的算法在3+3=6中运行,因为假设正好一半的元素大于O(n^2) 1 ,一半小于x。然后,您需要检查的组合数量为x
  3. 要在(n/2*n/2) /2 = n^2/8中解决问题,请考虑如果对数据进行排序会发生什么,给定数字O(nlogn),如果现在排序的数组中有一个数字arr[i],您能否有效找到?

    您甚至可以通过将元素放在哈希集中来增强上述x-arr[i]平均值,现在,如果给出一个数字O(n),如果yx-y,您是否可以有效找到还在集合中?

    修改 由于OP编辑了这个问题,因此引出的部分不再相关,而是引起了一个新的关注原因。

    (1)编辑问题中的x/2

答案 1 :(得分:2)

这是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])) {
                result[1] = index;
                // constant
                result[0] = map.get(target - array[index]);
                return result;
            }
            // constant
            map.put(array[index], index);
        }
        return result;
    }
}

答案 2 :(得分:1)

你走了,

使用合并排序对数组进行排序(时间复杂度:n logn)。拿两个指针/计数器,说i&amp; j,一个从索引0开始,另一个从n-1开始(假设n数组的大小为n)。

if array[i]+array[j]=sum 
      return;
    else if (array[i]+array[j]<sum) i++;
    else j--;

直到i>j

整体时间复杂度: n logn

答案 3 :(得分:1)

/ *时间复杂度= O(n) - 因为HashMap操作需要O(1)时间* /

if(sts.equals("succuss"))
        {
            Log.v(TAG,"in success block");
            lflag=true;

        }

答案 4 :(得分:0)

public void function(int [] array,int sum){

     for(int i = 0; i < array.length/2; i ++){
        for(int j = array.length-1;; j--){
            if(array[i]+array[j] < sum) break;
            if(array[i]+array[j] == sum) System.out.println(array[i]+" + "+array[j]+" = "+sum);
        }
    }
}