您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode中如何解决三数之和问题
## 问题描述
三数之和(3Sum)是LeetCode中一道经典的算法题(题目编号15),要求在一个整数数组中找到所有不重复的三元组`[nums[i], nums[j], nums[k]]`,使得`i != j != k`且`nums[i] + nums[j] + nums[k] = 0`。
示例:
```plaintext
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
直接使用三重循环枚举所有可能的三元组,时间复杂度为O(n³),在LeetCode上会超时。
def threeSum(nums):
result = []
n = len(nums)
for i in range(n):
for j in range(i+1, n):
for k in range(j+1, n):
if nums[i] + nums[j] + nums[k] == 0:
triplet = sorted([nums[i], nums[j], nums[k]])
if triplet not in result:
result.append(triplet)
return result
这是解决三数之和问题的标准解法,时间复杂度为O(n²)。
def threeSum(nums):
nums.sort()
result = []
n = len(nums)
for i in range(n-2):
# 跳过重复的起始值
if i > 0 and nums[i] == nums[i-1]:
continue
left, right = i+1, n-1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total < 0:
left += 1
elif total > 0:
right -= 1
else:
result.append([nums[i], nums[left], nums[right]])
# 跳过重复的左指针值
while left < right and nums[left] == nums[left+1]:
left += 1
# 跳过重复的右指针值
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
return result
import java.util.*;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;
int left = i + 1, right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum < 0) {
left++;
} else if (sum > 0) {
right--;
} else {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left+1]) left++;
while (left < right && nums[right] == nums[right-1]) right--;
left++;
right--;
}
}
}
return result;
}
}
排序的重要性:
去重处理:
双指针移动规则:
时间复杂度:O(n²)
空间复杂度:O(1)或O(n)
数组长度不足3:
if len(nums) < 3:
return []
所有元素相同:
[0,0,0,0]
应返回[[0,0,0]]
无解情况:
[1,2,3]
应返回空列表忘记排序:
去重不彻底:
指针移动错误:
类似的解法可以扩展到4Sum问题,只需在外层再加一层循环:
def fourSum(nums, target):
nums.sort()
result = []
n = len(nums)
for i in range(n-3):
if i > 0 and nums[i] == nums[i-1]:
continue
for j in range(i+1, n-2):
if j > i+1 and nums[j] == nums[j-1]:
continue
left, right = j+1, n-1
while left < right:
total = nums[i] + nums[j] + nums[left] + nums[right]
if total < target:
left += 1
elif total > target:
right -= 1
else:
result.append([nums[i], nums[j], nums[left], nums[right]])
while left < right and nums[left] == nums[left+1]:
left += 1
while left < right and nums[right] == nums[right-1]:
right -= 1
left += 1
right -= 1
return result
最接近的三数之和(LeetCode 16):
较小的三数之和(LeetCode 259):
三数之和问题是一个考察综合算法能力的经典题目,它融合了: - 排序算法的应用 - 双指针技巧 - 边界条件处理 - 去重逻辑
掌握这个问题的解法不仅可以帮助你通过面试,更能培养解决复杂问题的思维能力。建议在理解的基础上多次练习,并尝试解决其变种问题以加深理解。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。