zoukankan      html  css  js  c++  java
  • LeetCode18. 四数之和

    一、题目描述

    ☆☆☆☆二、解法

    思路:与三数之和思想一样,排序+对撞指针。 时间复杂度 O(n^3)+O(nlogn) -> O(n^3)

    需要注意去重以及剪枝,小细节非常多。

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            List<List<Integer>> res = new ArrayList<>();
            if (nums == null || nums.length < 4) return res;
            Arrays.sort(nums);
    
            int len = nums.length;
            for (int i = 0; i < len - 3; i++) {
                if (i > 0 && nums[i] == nums[i - 1]) continue; // 去重
                if (nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target) return res; // 【剪枝】
                if (nums[i] + nums[len-3] + nums[len-2] + nums[len-1] < target) continue; // 【剪枝】
                for (int j = i + 1; j < len - 2; j++) {
                    // 注意j的范围,不能是 j>0,否则过不了用例 [0,0,0,0] , 0
                    if (j > i + 1 && nums[j] == nums[j - 1]) continue; // 去重
                    if (nums[i] + nums[j] + nums[j+1] + nums[j+2] > target) break; // 【剪枝】
                    if (nums[i] + nums[j] + nums[len-2] + nums[len-1] < target) continue; // 【剪枝】
                    int start = j + 1, end = len - 1;
                    while (start < end) {
                        int tempSum = nums[i] + nums[j] + nums[start] + nums[end];
                        if (tempSum > target) {
                            end --;
                        }else if (tempSum < target) {
                            start ++;
                        }else {
                            res.add(Arrays.asList(nums[i],nums[j],nums[start],nums[end]));
                            while (start < end && nums[start] == nums[start + 1]) start ++; // 去重
                            while (start < end && nums[end] == nums[end - 1]) end --; // 去重
                            start ++;
                            end --;
                        }
                    }
                }
            }
            return res;
        }
    }
  • 相关阅读:
    死锁
    信号量
    实现临界区互斥的基本方法
    进程同步的基本概念:临界资源、同步和互斥
    操作系统典型调度算法
    [ 转]Collections.unmodifiableList方法的使用与场景
    【转】Android Support v4、v7、v13的区别和应用场景
    [转]finished with non-zero exit value 2
    [转]Git远程操作详解
    [转] git fetch与pull
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14117557.html
Copyright © 2011-2022 走看看