簡體   English   中英

以下程序的高效解決方案和最佳數據結構

[英]efficient solution and best data structure for the below program

我正在尋找一種解決問題的有效方法,即編寫一個程序以查找所有總和等於給定數字的整數對。 例如,如果輸入整數數組為{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) 

您可以使用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);
        }
    }
}

這是我的代碼:

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&5)和(5&2)重復出現。 需要條件i!=(sum-i)以防止配對時出現相同的數字。 (例如,如果您的總和為8,那么如果您不使用此條件,您還將獲得對(4,4))。

回答:

5和2

4和3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM