java - 如何在数组中找到总和为 k 的两个元素

标签 java arrays

假设给定一个未排序的整数数组

A = {3,4,5,1,4,2}

输入:6 输出:{5,1}, {4,2}

我如何在 O(n) 或 O(log n) 中执行此操作。任何建议将不胜感激。

更新: 我们能写出比这更高效的东西吗?

for(int i=0;i<array.length-1;i++)  
{  
    if(array[i]+array[i+1]==6)  
        System.out.println("{"+array[i]+","+array[i+1]+"}");  
}  

最佳答案

如果存储在输入数组中的数字仅为正数,那么我将创建另一个包含 k+1 个 ArrayList 元素的数组 K。其中 k 是您需要它们相加的数字。 只有两个小于 k 的数字可以加起来等于 k(假设我们处理正整数} 或在特殊情况下 {0,k}。 然后我会遍历输入数组的所有元素,对于每个小于或等于 k ​​的 int m,我会获取它的索引并将该索引添加到 ArrayList K 数组的索引 m 处。 然后我将遍历数组 K 的前半部分,对于其中存储了一些整数的每个索引 i,我将找到互补索引 [k-i] 并查看其中是否有任何值。如果有,那么这些就是你的对。 顺便说一句,这是 O(n)。

public static void findElemtsThatSumTo( int data[], int k){
    List arrayK[]= new List[k+1];
    for(int i=0; i<arrayK.length; i++)
        arrayK[i]= new ArrayList<Integer>();

    for(int i=0; i<data.length; i++){
        if(data[i]<=k)
            arrayK[data[i]].add(i);
    }

    for(int i=0; i<arrayK.length/2; i++){
        if(!arrayK[i].isEmpty() && !arrayK[k-i].isEmpty())
        {
            for(Object index: arrayK[i])
                for(Object otherIndex: arrayK[k-i])
                    System.out.println("Numbers at indeces ["+index.toString()+", "+otherIndex.toString()+"] add up to "+k+".");
        }
    }

}

关于java - 如何在数组中找到总和为 k 的两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8373614/

相关文章:

Java 集合和映射

java - 我们可以在 Spark sql 中触发传统的连接查询吗

java - 设置背景颜色不起作用

java - JPA/Hibernate 查询 : load eagerly with subselect

arrays - 从 EXcel VBA 中的 Join() 函数中删除分隔符

php - 将字符串转换为多维数组以在php中计算日期

java - WebDriver - 使用 Java 等待元素

c++ - 检索数组名称

javascript - if 条件在数组迭代中始终返回 true

php - foreach 循环中的动态编号变量