以下算法工作:3Sum算法版本O(N^2 logn)时间
给定n个整数NUMS和靶的阵列,找到的 索引三胞胎数I,J,K 0 < = i < j < k < n满足 条件nums [i] + nums [j] + nums [k] <目标。
例如,给定NUMS = [-2,0,1,3],并且目标= 2
返回2.因为有两个三联体总和是小于2:
def three_sum_smaller(nums, target)
nums.sort!
i = 0
triplet_count = 0
while i < nums.length
j = i + 1
while j < nums.length
pair_sum = nums[i] + nums[j]
val = target - pair_sum
k = binary_search(nums, val) #if val in it, we want all indices between j and k. else all indices j and k including k.
(nums[k] == val) ? triplet_count += (j + 1...k).size : triplet_count += (j + 1..k).size #ensures k > j.
j += 1
end
i += 1
end
triplet_count
end
def binary_search(arr, val)
b_search(arr, val, 0, arr.length - 1)
end
def b_search(arr, val, low, high)
while low < high
mid = (low + high)/2
if arr[mid] > val #left half
high = mid - 1
elsif arr[mid] < val
low = mid + 1
else
#go left until it's no longer k and return this.
until arr[mid] != val
mid -= 1
end
return mid
end
end
low
end
我的代码是关闭的1以下的测试用例:
arr = [-3,4,-4,1,-1,-2,-1,-1,-5]
target = -3
Correct output: 48
My output: 59
该方法的工作原理如下。对于每一对可能的对,执行一个二进制搜索,查找使对==总和为目标的值。如果该值不存在,则返回小于它的索引。如果是,则返回该值的第一个匹配项。然后,如果找到该值,则仅将j和k之间的索引(不包括k)作为三元组完成。如果未找到该值,则将指标包括j作为三重完成。
这可以用于200个左右的测试用例,并且在之后失败。我不知道有什么问题..
在问题的陈述,没有要求这些数字进行排序,在这种情况下 – Aegis
我整理的输入,这样我可以得到一个O这样的二进制搜索将不会是证明3 (n^2 logn)时间复杂度 – Sunny
嗯,我刚刚使用你的代码运行你的例子,我得到59作为回应 – Aegis