查找是否有任何两个列表值总和为给定值

时间:2014-01-12 18:09:44

标签: java for-loop arraylist

当我被要求编写一个方法来检查数组列表中的任何对是否等于给定值时,我想出了这个:

import java.util.ArrayList;

public class FindWhetherTwoInArrEqual {

    public static void main(String[] args) {
        ArrayList<Integer> arr = new ArrayList<Integer>();
        arr.add(10);        arr.add(12);
        arr.add(18);        arr.add(10);
        arr.add(8);         arr.add(12);
        arr.add(33);        arr.add(28);
        arr.add(2);         arr.add(20);
        findWhetherTwoInArraySumToValue(arr, 30);
    }
    public static boolean findWhetherTwoInArraySumToValue(ArrayList<Integer> array, int value)
    {
        for(int i = 0; i < array.size(); ++i)
            for(int j=i+1; j < array.size(); ++j)
                if(array.get(i) + array.get(j) == value)               
                    System.out.println(array.get(i) +" + "+ array.get(j) + " = " + value); 
        return false;
    }    
}

结果:

10 + 20 = 30
12 + 18 = 30
18 + 12 = 30
10 + 20 = 30
28 + 2 = 30

时间复杂度为O(n)。

有更有效的方法吗?

4 个答案:

答案 0 :(得分:1)

假设该对不需要按特定顺序发生,您可以这样做:

  • #1对该对进行排序,假设A在该对中最小,B在该对中最大
  • #2 Quicksort数组:请参阅以下网址:

    http://gauss.ececs.uc.edu/Courses/C321/html/quicksort.java.html

  • #3开始在排序数组中查找A.一旦发生更大的元素,就没有匹配。
  • #4开始在排序数组中查找B.一旦发生更大的元素,就没有匹配。
  • #5如果#3和#4都匹配,则该对位于数组中。

答案 1 :(得分:1)

我不知道它是否更快并且忍受我,因为我只有15岁,但我认为您可以计算出数组中每个元素的对数,然后检查它是否在数组中。至少它看起来更简单(对我而言) 例:

public static boolean findWhetherTwoInArraySumToValue(ArrayList<Integer> array, int value)
{
    for(int element : array){
        int find = element - value;
        if(array.contains(find)){
            System.out.println(element +" + "+ find + " = " + value);
        }
    }
    return false;
}

答案 2 :(得分:1)

订单-N,Marko指出:

通过1:确定您拥有的值。 Hashset by value,或30个元素数组中的tickmarks(假设您没有负数),或其他一些快速检索机制。

通过2:从found=0开始。对于每个值,请检查表格以查看它是否包含30-value。如果是,请增加found

返回found>1

答案 3 :(得分:1)

你可以尝试这段代码:

 for(int i =0;i< array.size(); ++i){
        if(array.contains(value - array.get(i)))
        {
            System.out.println((value - array.get(i)) +" + "+ array.get(i) + " = " + value);
        }
    }