要求
给定一个长度为 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) 的时间复杂度内解决?
核心代码
class Solution:
def threeSumSmaller(self, nums: List[int], target: int) -> int:
res = 0
nums.sort()
for i,num in enumerate(nums):
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 += 1
return res
解题思路:我们使用循环的时候,每次取出来一个值,然后使用target - 当前值,最终又变成了两个数加和的问题,因为提前进行了排序,所以可以从左右两端完成数据的加和,然后和大,减小右边,当满足左右加和小于新目标值的时候,我们将left和right之间都是符合条件的数据。