let 前往下载 = " http://icourse8.com/sftgssj.html ";01 合格程序员的第一步:算法与数据结构
02 如何事半功倍地学习算法与数据结构
03 如何计算算法的复杂度
04 如何通过LeetCode来进行算法题目练习
理论讲解+面试题实战
05 理论讲解:数组&链表
06 面试题:反转一个单链表&判断链表是否有环
07 理论讲解:堆栈&队列
08 面试题:判断括号字符串是否有效
09 面试题:用队列实现栈&用栈实现队列
10 理论讲解:优先队列
11 面试题:返回数据流中的第K大元素
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ls = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) { // 跳过可能重复的答案
int l = i + 1, r = nums.length - 1, sum = 0 - nums[i];
while (l < r) {
if (nums[l] + nums[r] == sum) {
ls.add(Arrays.asList(nums[i], nums[l], nums[r]));
while (l < r && nums[l] == nums[l + 1]) l++;
while (l < r && nums[r] == nums[r - 1]) r--;
l++;
r--;
} else if (nums[l] + nums[r] < sum) {
while (l < r && nums[l] == nums[l + 1]) l++; // 跳过重复值
l++;
} else {
while (l < r && nums[r] == nums[r - 1]) r--;
r--;
}
}
}
}
return ls;
}
}