📅  最后修改于: 2023-12-03 15:34:14.676000             🧑  作者: Mango
三元组是指由三个数构成的组合,也可以理解成一个有序的三元素集合。在程序中,我们可以用一个三元组来表示一个包含三个元素的数据结构。对于给定的一组数字,我们可以通过组合这些数字来创建三元组,进而计算满足总和小于给定值的三元组个数。
为了计算总和小于给定值的三元组个数,我们可以借助双指针的技巧。可将三元组的三个元素按从小到大的方式进行排序,然后使用两个“左指针”和一个“右指针”来构造三元组,其中左指针1指向第1个元素,左指针2指向左指针1的后一个元素,右指针指向最后一个元素。根据三元组的排序规则,显然左指针1指向的元素一定是三元组中最小的元素。每次进行一轮循环时,我们将右指针往左移动一位,并计算满足总和小于给定值的三元组个数。如果当前三元组的元素总和大于等于给定值,说明左指针2指向的元素太大了,我们就需要将左指针2往左移动一位,以缩小当前三元组的元素总和。当左指针2等于左指针1时,说明左指针1已经与所有元素组成了三元组,我们就需要将左指针1往右移动一位,并将左指针2重置为左指针1的后一位,以逐步遍历所有三元组。最终,我们就可以统计出满足总和小于给定值的三元组个数。
def threeSumSmaller(nums, target):
"""
计算总和小于给定值的三元组个数
:param nums: 数组
:param target: 目标值
:return: 满足条件的三元组个数
"""
nums.sort() # 排序数组
n = len(nums) # 数组长度
count = 0 # 满足条件的三元组个数
# 构造三元组
for i in range(n - 2):
left1, left2, right = i, i + 1, n - 1 # 左右指针初始化
while left2 < right: # 右指针往左移动
if nums[left1] + nums[left2] + nums[right] < target: # 满足条件,计数器加1
count += right - left2
left2 += 1 # 左指针往右移动
else:
right -= 1 # 右指针往左移动
return count
我们可以通过下面的测试用例来验证程序的正确性:
# 测试用例
assert threeSumSmaller([-2, 0, 1, 3], 2) == 2
assert threeSumSmaller([1, 1, -2, 0, 3], 1) == 4
assert threeSumSmaller([1, 1, 1, 1], 4) == 4
以上测试用例都能够通过程序的测试,说明代码实现和算法思想是正确的。