java - 给定一个目标总和,找出给定数组中是否有一对元素总和等于它

标签 java hashmap complexity-theory

import java.util.HashMap;

public class target 
{
    public static void hash(int []a,int sum)
    {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

        int i;

        for (i = 0; i < a.length; ++i) 
            map.put(a[i], sum-a[i]);

        for (i = 0; i < a.length; ++i) 
            if(map.containsValue(a[i]) && map.get(a[i])!=null)
             {
                System.out.println("("+a[i]+","+map.get(a[i])+")");
                map.remove(a[i]);
             }
    }

public static void main(String[] args)
{
    int []a={1, 2, 13, 34, 9, 3, 23, 45, 8, 7, 8, 3, 2};
    hash(a,11);
}
}

我想知道是否有比上述解决方案更好、更有效的解决方案。这个的复杂度是n。我可以做得更好吗?

最佳答案

您的实现遗漏了重复的对。


你可以

  1. 对数组进行排序
  2. 从头开始遍历每个元素

    • 计算所需的补数(和-元素)
    • 进行反向二分搜索(从排序数组的末尾开始)寻找该精确值

    • 如果找到,将两者都删除

归结为观察到的元素排序:

 n1 < n2 < n3 < n4 < n5 < n6

最有可能的对是对称地从两端到中间。现在,最坏的情况仍然很糟糕,但至少你没有哈希表开销

关于java - 给定一个目标总和,找出给定数组中是否有一对元素总和等于它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5760738/

相关文章:

java - 如何通过复合对象属性查找?

java - quartz spring集成调度,是否可以动态设置cron触发器

Java-Stream - 使用单个流对字符串中的数据进行拆分、分组和映射

java - 如何打印出HashMap的值?输出如 xxx@da52a1

performance - 任何算法的时间复杂度是否有可能随着输入大小的增加而降低,例如

算法反模式的命名

java - 如何通过位置名称查找地址(android google map)

java - Java 中的 HTTP "POST"

java - 对于这种情况,我应该使用什么类似 HashMap 的集合?

algorithm - 该算法的复杂性