【问题标题】:find whether any two list values sum to given value查找任何两个列表值的总和是否为给定值
【发布时间】:2014-01-12 18:09:44
【问题描述】:

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

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)。

有没有更有效的方法?

【问题讨论】:

  • 你的意思是任何一对的总和?
  • 这不是算法,而是实现注释:我会将array.get(i)array.get(j) 缓存到变量中。 JIT 可能可以为您做到这一点,但您知道您可以做到,所以... 如果您的范围正确,您甚至可以将它们设为final 作为对 JIT 的附加提示。示例:pastie.org/8626976
  • 项目 HASHCODE 怎么样?
  • 这不是线性时间,而是二次时间。使用哈希集,您可以轻松获得线性。

标签: java for-loop arraylist


【解决方案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);
        }
    }   

【讨论】:

    【解决方案2】:

    假设这对不需要以特定顺序出现,您可以这样做:

    • #1 对这对排序并假设 A 在这对中最小,B 在这对中最大
    • #2 对数组进行快速排序:请参阅此 URL:

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

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

    【讨论】:

      【解决方案3】:

      我不知道它是否更快并忍受我,因为我只有 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;
      }
      

      【讨论】:

      • 好主意,虽然数组的 .contains() 是线性搜索,所以它不会改善事情。不过,您走在正确的轨道上;一旦你将值复制到类似 hashshet 的东西中,它可以更快地运行 .contains(),这一个改进。
      【解决方案4】:

      Order-N,正如 Marko 指出的那样:

      第 1 步:确定您拥有哪些价值观。 Hashset by value,或 30 元素数组中的刻度线(假设您没有底片),或其他一些快速检索机制。

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

      返回found&gt;1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 2010-10-22
        • 2013-10-29
        • 1970-01-01
        相关资源
        最近更新 更多