[英]How to find all ordered pairs of elements in array of integers whose sum lies in a given range of value
[英]Find all pairs of elements within an array that sum up to a given value
我陷入了以下问题描述的Hackerrank问题之一:-
您将获得一个整数数组和一个目标值。 确定差值等于目标值的数组元素对的数量。
例如,给定一个数组[1, 2, 3, 4]
和目标值1
,我们有三个满足条件的值: (2,1), (3,2), (4,3)
。 所以 function 对应该返回值3
。
我们必须使用以下参数实现对 function :-
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.
由于错误的结果,我下面的 function 实现未能通过 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
这应该是一个 O(n) 解决方案(其中n
是arr
的大小)。 首先,将数组转换为集合。 然后遍历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
通过 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 ;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.