🌕 15. 三数之和
2022年6月9日
- algorithm
🌕 15. 三数之和
难度: 🌕
问题描述
解法
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
// 思路:
// 固定一个数,双指针法求另 2 个数
// 双指针遍历一遍 == O(N)
// 移动固定的数,总复杂度 == O(N^2)
// 这时候加上 排序的 O(Log N) 就无需在意了
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
for(int i = 0; i <= len - 3; i ++) {
// 最左边界数去重
if(i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int target = - nums[i];
int left = i + 1;
int right = len - 1;
while(left < right) {
int sum = nums[left] + nums[right];
if(sum == target) {
// System.out.println(i + " -- " + left + " " + right + " " + target + " " + sum);
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[left]);
list.add(nums[right]);
res.add(list);
// 去重
while(left + 1 < right && nums[left] == nums[left + 1]) {
left ++;
}
while(left < right - 1 && nums[right - 1] == nums[right]) {
right --;
}
// System.out.println(i + " -- " + left + " " + right + " " + target + " " + sum);
left ++; // 产生改变
} else if(sum < target) {
left ++;
} else {
right --;
}
}
}
return res;
}
}