以下程序的有效解决方案和最佳数据结构

时间:2014-10-14 10:14:29

标签: java data-structures

我正在寻找解决问题的有效方法.. 编写一个程序来查找总和等于给定数字的所有整数对。例如,如果输入整数数组为{2,6,3,9,11}且给定的和为9,则输出应为{6,3}

现在我所尝试的是以下内容,但我知道这不是一个可行而有效的解决方案..

从数组中取一个数字然后循环遍历数组和输出对,它们等于给定的总和。您对第一个数组中的所有数字执行此操作,

import java.util.Arrays;

/**
 * Java Program to find pairs on integer array whose sum is equal to k

 */
public class ProblemInArray{

    public static void main(String args[]) {
        int[] numbers = { 2, 4, 3, 5, 7, 8, 9 };
        int[] numbersWithDuplicates = { 2, 4, 3, 5, 6, -2, 4, 7, 8, 9 };
        prettyPrint(numbers, 7);
        prettyPrint(numbersWithDuplicates, 7);
    }

    /**
     * Prints all pair of integer values from given array whose sum is is equal to given number.
     * complexity of this solution is O(n^2)
     */
    public static void printPairs(int[] array, int sum) {

        for (int i = 0; i < array.length; i++) {
            int first = array[i];
            for (int j = i + 1; j < array.length; j++) {
                int second = array[j];

                if ((first + second) == sum) {
                    System.out.printf("(%d, %d) %n", first, second);
                }
            }

        }
    }
    /**
     * Utility method to print input and output for better explanation.
     */
    public static void prettyPrint(int[] givenArray, int givenSum){
        System.out.println("Given array : " + Arrays.toString(givenArray));
        System.out.println("Given sum : " + givenSum);
        System.out.println("Integer numbers, whose sum is equal to value : " + givenSum);
        printPairs(givenArray, givenSum);
    }

}

Output:
Given sum : 7
Integer numbers, whose sum is equal to value : 7
(2, 5) 
(4, 3) 
Given array : [2, 4, 3, 5, 6, -2, 4, 7, 8, 9]
Given sum : 7
Integer numbers, whose sum is equal to value : 7
(2, 5) 
(4, 3) 
(3, 4) 
(-2, 9) 

2 个答案:

答案 0 :(得分:3)

您可以使用HashMap。如果所需的总和 - 当前项目达到一个现有值,您可以确定这是一个可能的匹配。否则添加当前项目。 这应该在O(n)中运行。

public static final void sums(final int sum, final int[] numbers){
    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i : numbers){
        if(map.containsKey(sum-i)){
             System.out.println("( "+map.get(sum-i) +" "+ i+" )");
        }else{
            map.put(i,i);
        }
    }
}

答案 1 :(得分:0)

这是我的代码:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class FindPairs {
    public static void main(String args[]) {
        Integer[] numbers = { 2, 4, 3, 5, 7, 8, 9 };
        int sum = 7;
        List<Integer> Numbers = Arrays.asList(numbers);
        Collections.sort(Numbers);
        for (int i : Numbers) {
            if (Numbers.contains(sum - i) && i <= (sum / 2) && i != (sum - i)) {
                System.out.print((sum - i) + " & ");
                System.out.println(+i);
            }
        }
    }
}

需要条件i <=(sum / 2)以防止对(2&amp; 5)和(5&amp; 2)的双重复。 需要条件i!=(sum-i)来防止配对中的相同数量。 (例如,如果你的金额是8,那么如果你不使用这个条件,你也会得到一对(4,4))。

答案:

5&amp; 2

4&amp; 3