Java 查找任意两个列表值的总和是否为给定值

Java 查找任意两个列表值的总和是否为给定值,java,for-loop,arraylist,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);

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

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;
    }    
}
时间复杂度为O(n)


有更有效的方法吗?

假设配对不需要按特定顺序出现,您可以这样做:
  • #1对该对进行排序,并假设A是该对中最小的,B是该对中最大的
  • #2对数组进行快速排序:查看以下URL:

    开始在排序的数组中查找。一旦出现较大的元素,就没有匹配项。 开始在已排序数组中查找B。一旦出现较大的元素,就没有匹配项。
  • #5如果#3和#4都匹配,则该对在数组中。

假设配对不需要以特定顺序出现,您可以执行以下操作:
  • #1对该对进行排序,并假设A是该对中最小的,B是该对中最大的
  • #2对数组进行快速排序:查看以下URL:

    开始在排序的数组中查找。一旦出现较大的元素,就没有匹配项。 开始在已排序数组中查找B。一旦出现较大的元素,就没有匹配项。
  • #5如果#3和#4都匹配,则该对在数组中。

我不知道它是否更快,请容忍我,因为我只有15岁,但我想你可以计算出数组中每个元素的配对数,然后检查它是否在数组中。至少它看起来更简单(对我来说) 例:

public静态布尔findwhethertwinaraysumtovalue(ArrayList数组,int值)
{
for(int元素:数组){
int find=元素-值;
if(array.contains(find)){
System.out.println(元素+“+”+查找+“=”+值);
}
}
返回false;
}

我不知道它是否更快,请原谅我,因为我只有15岁,但我想你可以计算出数组中每个元素对应的数字,然后检查它是否在数组中。至少它看起来更简单(对我来说) 例:

public静态布尔findwhethertwinaraysumtovalue(ArrayList数组,int值)
{
for(int元素:数组){
int find=元素-值;
if(array.contains(find)){
System.out.println(元素+“+”+查找+“=”+值);
}
}
返回false;
}

Order-N,正如Marko所指出的:

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

过程2:从
found=0开始。对于每个值,检查表中是否包含
30个值
。如果是,则找到增量


返回
found>1

Order-N,正如Marko指出的:

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

过程2:从
found=0开始。对于每个值,检查表中是否包含
30个值
。如果是,则找到增量


Return
found>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);
        }
    }   
for(int i=0;i
你能试试这个代码吗:

 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);
        }
    }   
for(int i=0;i
你是指任意一对的和吗?这不是一个算法,而是一个实现注释:我将
array.get(I)
array.get(j)
缓存到变量。JIT可能可以为您做到这一点,但您知道您可以做到,所以。。。如果范围正确,甚至可以将它们设置为
final
,作为JIT的附加提示。示例:HASHCODE项如何?可能的重复不是线性的,而是二次时间。使用hashset,你可以很容易地得到线性。你是说任意一对的和吗?这不是一个算法,而是一个实现注释:我将
array.get(I)
array.get(j)
缓存到变量。JIT可能可以为您做到这一点,但您知道您可以做到,所以。。。如果范围正确,甚至可以将它们设置为
final
,作为JIT的附加提示。示例:HASHCODE项如何?可能的重复不是线性的,而是二次时间。使用hashset,您可以轻松获得线性。不过,这是一个好主意。数组的.contains()是一个线性搜索,因此它不会改善情况。不过,你的思路是对的;一旦您将值复制到hashshet之类的文件中,它可以更快地运行.contains(),这是一个改进。不过,这是一个好主意。数组的.contains()是一个线性搜索,因此它不会改进。不过,你的思路是对的;一旦将这些值复制到hashshet之类的文件中,可以更快地运行.contains(),这就是一种改进。
 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);
        }
    }