给定一个长度为 n 的整数数组和一个目标值 target,寻找能够使条件 nums[i] + nums[j] + nums[k] < target 成立的三元组 i, j, k 个数(0 <= i < j < k < n)。
示例:
输入: nums = [-2,0,1,3], target = 2
输出: 2
解释: 因为一共有两个三元组满足累加和小于 2:
[-2,0,1]
[-2,0,3]
进阶:是否能在 O(n2) 的时间复杂度内解决?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-smaller
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种思路:
O(N^3)的三重循环解非常好想,比较麻瓜没有实现。
第二种思路:
看到 i < j < k, 可以联想到先把nums排好序,
然后利用一重外循环,一重内部双指针处理有序数组的两数之和问题。
class Solution(object):
def threeSumSmaller(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
res = 0
nums.sort()
for i, num in enumerate(nums):
# 现在要在比i大的下标里,找能组合出target - num 的两个数的组合
t = target - num
left, right = i + 1, len(nums) - 1
while left < right:
if nums[left] + nums[right] >= t:
right -= 1 #和太大了,尝试把和缩小
elif nums[left] + nums[right] < t:
res += right - left #在这种情况下,left可以与【left + 1, right】间任意一个数组成一组答案
left += 1
return res