Problem: 15. 三数之和
解题方法
暴力循环 + 剪枝,需要先排序再剪枝
Code
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
# 暴力解
n = len(nums)
res = []
nums.sort()
for i in range(n - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
k = n - 1
target = -nums[i]
for j in range(i + 1, n - 1):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
while j < k and nums[j] + nums[k] > target:
k -= 1
if j == k:
break
if nums[j] + nums[k] == target:
res.append([nums[i], nums[j], nums[k]])
return res
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<>();
int n = nums.length;
for(int i = 0; i < n - 2; i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
if(nums[i] > 0){
continue;
}
for(int j = i + 1; j < n - 1; j++){
if(j > i + 1 && nums[j] == nums[j - 1]){
continue;
}
if(nums[i] + nums[j] > 0){
continue;
}
for(int k = j + 1; k < n; k++){
if(nums[i] + nums[j] + nums[k] == 0){
List<Integer> arr = new ArrayList<>();
arr.add(nums[i]);
arr.add(nums[j]);
arr.add(nums[k]);
ans.add(arr);
break;
}
else if(nums[i] + nums[j] + nums[k] > 0){
break;
}
}
}
}
return ans;
}
}