【问题标题】:Find all pairs of elements within an array that sum up to a given value查找数组中总和为给定值的所有元素对
【发布时间】:2020-02-22 08:36:21
【问题描述】:

我陷入了 Hackerrank 问题之一,问题描述如下:-

您将获得一个整数数组和一个目标值。确定差值等于目标值的数组元素对的数量。

例如,给定一个[1, 2, 3, 4] 的数组和1 的目标值,我们有三个满足条件的值:(2,1), (3,2), (4,3)。所以函数对应该返回值3

我们必须使用以下参数实现pairs函数:-

k: an integer, the target difference
arr: an array of integers

约束:-

1> Each Integer in arr[i] will be unique and positive.
2> target k will also be positive.

由于结果错误,我的以下函数实现未能通过 18 个测试用例之一。谁能帮我调试一下这个问题:-

def binSearch(target,arr):
    lower = 0
    upper = len(arr)-1
    while lower <= upper:
        mid = int((lower + upper)/2)
        if(arr[mid] == target):
            return 1
        elif(arr[mid] > target):
            upper = mid - 1
        elif(arr[mid] < target):
            lower = mid + 1
    return -1

def pairs(k, arr):
    arr.sort()
    count = 0
    for i in range(len(arr)):
        target = abs(arr[i] - k)
        if(arr[i] == target):
            pass
        elif(binSearch(target,arr) == 1):
            count += 1
    return count

【问题讨论】:

  • target = abs(arr[i] - k) 对我来说似乎不合适。假设k=7。如果 a[i] 是 3,那么目标应该是 10,但 abs(arr[i] - k) 是 4。
  • @user3386109 你是绝对正确的。我删除了 abs 函数,它起作用了。

标签: python algorithm debugging


【解决方案1】:

这应该是一个 O(n) 解决方案(其中narr 的大小)。首先,将数组转换为集合。然后遍历arr中的每个值并检查arr + k是否在集合中,即另一个值与当前值val之间的差等于k。如果是这样,请将counter 加一。

def pairs(k, arr):
    counter = 0
    set_arr = set(arr)
    for val in arr:
        if val + k in set_arr:
            counter += 1
    return counter

【讨论】:

  • +1 。这是一个更好的解决方案,但我的问题是找出 user3386109 确实指出的我的代码问题。
【解决方案2】:

通过java,朗姆酒时间需要O(n log n)来排序数组,而二进制搜索需要O(log m)所以O(n log n + log m)==> O(n log n) 空间需要 O(n)

public static ArrayList<Pair<Integer, Integer>> pairThatHaveDiffrenceK(int[] arr , int arrLength , int k ){



        ArrayList<Pair<Integer, Integer>> arrayList = new ArrayList<>();
        Arrays.sort(arr);

        for (int i = 0; i < arrLength ; i++) {
            temp = arr[i] + k;
            int testIfFound = indexFromBinarySearch(arr, temp);
            if (testIfFound != -1){
                arrayList.add(new Pair<>(arr[i],arr[testIfFound] ));
           }
        }

        return arrayList ;
    }


    public static int indexFromBinarySearch(int[] arr, int valueForTarget){
        int start =0 ;
        int end = arr.length-1;
        while (start <= end){
            int mid = (start+end)/2 ;
            if(arr[mid] == valueForTarget){
                return mid;
            }
            else if(valueForTarget > arr[mid])
                start =mid+1;
            else
                end = mid-1;

        }
        return -1 ;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 2022-01-09
    • 2018-11-03
    • 2015-02-26
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多