算法面试通关40讲

1,295 阅读1分钟

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;
    }
}