leetcode_259 较小的三数之和

221 阅读1分钟

要求

给定一个长度为 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

image.png

解题思路:我们使用循环的时候,每次取出来一个值,然后使用target - 当前值,最终又变成了两个数加和的问题,因为提前进行了排序,所以可以从左右两端完成数据的加和,然后和大,减小右边,当满足左右加和小于新目标值的时候,我们将left和right之间都是符合条件的数据。