题目
注意:三数之和属于双指针问题,二数之和属于哈希问题。
四数之和跟此题完全一致,也是双指针问题!
基础知识
python list中sorted()和.sort()的用法区别:
"""
sorted()方法的返回值是升序排列后的新列表。
sort()方法无返回值,但是使用sort()方法之后,排序后的列表会覆盖原来的列表。
"""
a = [5, 7, 6, 3, 4, 1, 2]
b = sorted(a) # 保留原列表
print(a) # [5, 7, 6, 3, 4, 1, 2]
print(b) # [1, 2, 3, 4, 5, 6, 7]
li_one = [6, 3, 4, 1]
li_one.sort()
print(li_one) # [1, 3, 4, 6]
Python
重点看写法1,跟四数之和写法完全一致!
# 写法1
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
nums.sort()
n = len(nums)
i, j, k = 0, 1, n-1
for i in range(n):
if i > 0 and nums[i] == nums[i-1]:
continue
j, k = i+1, n-1
while j < k:
if nums[j] + nums[k] == -nums[i]:
res.append([nums[i], nums[j], nums[k]])
j += 1
k -= 1
while j < k and nums[j] == nums[j-1]:
j += 1
while j < k and nums[k] == nums[k+1]:
k -= 1
elif nums[j] + nums[k] < -nums[i]:
j += 1
else:
k -= 1
return res
# 写法2
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res = list()
i = 0
while i < len(nums): # 注意: 这里是while循环, 不是for循环!!!
j, k = i+1, len(nums) - 1
while j < k:
if nums[j] + nums[k] == -nums[i]:
res.append([nums[i], nums[j], nums[k]])
j += 1
k -= 1
while j < k and nums[j-1] == nums[j]:
j += 1
while j < k and nums[k] == nums[k+1]:
k -= 1
elif nums[j] + nums[k] < -nums[i]:
j += 1
else:
k -= 1
i += 1
while i < len(nums) and nums[i] == nums[i-1]:
i += 1
return res
Java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int n = nums.length;
if (n < 3) {
return res;
}
Arrays.sort(nums);
for (int i = 0; i < n - 2; ++i) {
if (nums[i] > 0) {
break;
}
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int j = i + 1, k = n - 1;
while (j < k) {
int tmp = nums[i] + nums[j] + nums[k];
if (tmp == 0) {
res.add(new ArrayList<>(Arrays.asList(nums[i], nums[j], nums[k])));
while (j + 1 < k && nums[j + 1] == nums[j]) {
++j;
}
while (k - 1 > j && nums[k - 1] == nums[k]) {
--k;
}
++j;
--k;
} else if (tmp < 0) {
++j;
} else {
--k;
}
}
}
return res;
}
}
版本2代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums.length < 3) {
return res;
}
Arrays.sort(nums);
int i = 0, j, k;
while (i < nums.length - 2) {
j = i + 1;
k = nums.length - 1;
while (j < k) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<Integer> tmp = new ArrayList<>(Arrays.asList(nums[i], nums[j], nums[k]));
res.add(tmp);
++j;
--k;
while (j < k && nums[j] == nums[j - 1]) {
++j;
}
while (j < k && nums[k] == nums[k + 1]) {
--k;
}
} else if (nums[i] + nums[j] + nums[k] > 0) {
--k;
} else {
++j;
}
}
++i;
while (i < nums.length && nums[i] == nums[i - 1]) {
++i;
}
}
return res;
}
}

文章介绍了两种解决方案(版本1和版本2)解决编程问题——寻找数组中三个数之和为零的三元组,分别运用了双指针方法和哈希表优化。版本1采用分治策略,而版本2简化了循环条件。

被折叠的 条评论
为什么被折叠?



