在一个数组中查找总计为给定总和的非重复对

时间:2019-06-04 04:00:21

标签: java arrays sum

  

例如,为我提供了一个数组:1、3、9、6、5、8、3、4   问题是我必须在上述数组中找到总和为9的对。但是,该对不能重复。这意味着,如果我已经找到了第一对[3,6],那么第二对[6,3]将不被接受。

     

此问题的输出应为[1,8] [3,6] [5,4](没有[6,3],因为它是重复的)

     

我使用Java 8解决了这个问题。

     

以下是我尝试的一些代码:

public static void printSumNine(int[] input)
{
    for (int i = 0; i < input.length - 1; i++) {
        for (int j = i + 1; j < input.length; j++) {
            if (9 - input[i] == input[j]) {
                System.out.println("[" + input[i] + ", " + input[j] + "]");
            }
        }
    }
}
  

然后我将输入内容放入参数中       int input[] = {1, 3, 9, 6, 5, 8, 3, 4};

我希望输出应为:

[1, 8] 
[3, 6]
[5, 4]

但是我的代码产生了不同的输出:

[1, 8]
[3, 6]
[6, 3]
[5, 4]

3 个答案:

答案 0 :(得分:1)

----- **更新以获得更好的解决方案** ------

如果您不介意数字的成对顺序,我建议您使用Set,它只需O(N)即可比当前解决方案中的O(NlogN)更好地完成任务。 / p>

解决方案:

    int N = 9;
    Set<Integer> set = new HashSet<>();
    int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };

    for (int i = 0; i < input.length; i++) {
        //condition N = input[i] * 2 is for some cases such as (N = 8, and array contains 2 numbers which have same value 4)
        if (set.contains(N - input[i]) && (!set.contains(input[i]) || (N ==input[i] *2)) {
            System.out.println(input[i] + " - " + (9 - input[i]));
        }
        set.add(input[i]);
    }

Hashset.contains的复杂度为O(1),而您只需要运行1个循环即可解决问题。


我建议使用Map删除重复项。

Map<Integer, Integer> usedMap

这是我的修改版本。尽管它的复杂性不好,但是可行。如果可以找到其他具有更好复杂性的方法,我将对其进行编辑。

    Map<Integer, Integer> usedMap = new HashMap<Integer, Integer>();

    int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };
    for (int i = 0; i < input.length - 1; i++) {
        if (!usedMap.containsKey(input[i])) {
            for (int j = i + 1; j < input.length; j++) {
                if (!usedMap.containsKey(input[j])) {
                    if (9 - input[i] == input[j]) {
                        System.out.println("[" + input[i] + ", " + input[j] + "]");
                        usedMap.put(input[j], 1);
                    }
                }
            }
            usedMap.put(input[i], 1);
        }

    }

答案 1 :(得分:0)

尝试此代码。我已经使用哈希表存储数据。打印时,我在打印前验证哈希图中的值。

dlsym

答案 2 :(得分:0)

首先,添加重复对以检查您的方法,如下所示:

import asyncio import websockets async def ws_rec(websocket, path): while True: data = await websocket.recv() print(data) start_server = websockets.serve(ws_rec, 'localhost', 8765) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() print("ok") ,假设m+n=sm<n

n-m=x

m+n=m+m+x=s

因为m不同,所以x也不同,所以我们可以使用x来标识对,而每个对都需要一点标记:

x=s-2m

解决此问题的常用方法,需要花费public static void printSumNine(int[] input) { BitSet checkPool = new BitSet(input.length); for (int i = 0; i < input.length - 1; i++) { for (int j = i + 1; j < input.length; j++) { if (9 - input[i] == input[j]) { int checkSum = Math.abs(input[i] - input[j]); if (!checkPool.get(checkSum)) { checkPool.flip(checkSum); System.out.println("[" + input[i] + ", " + input[j] + "]"); } } } } } 的时间并且不需要其他内存:

nlog(n)