• 18.4Sum


    给定一个数组和一个目标数字,求数组中的4个元素之和等于目标数字,输出这4个数字所有可能的组合。

    Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

    A solution set is:
    [
     [-1, 0, 0, 1],
     [-2, -1, 1, 2],
     [-2, 0, 0, 2]
    ]

    思路:
    和LeetCode 15. 3Sum 很像,处理上也按 3Sum处理。在 3Sum外面再套一层循环即可。

    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        for (int i = 0; i < n-3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1; j < n - 2; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int l = j + 1, r = n - 1, remain = target - nums[i] - nums[j];
                while (l < r) {
                    if (l > j+1 && nums[l] == nums[l - 1]) {
                        l++; continue;
                    }
                    if (nums[l] + nums[r] > remain) r--;
                    else if (nums[l] + nums[r] < remain) l++;
                    else res.push_back({ nums[i],nums[j],nums[l++],nums[r--] });
                }
            }
        }
        return res;
    }

    Java 版:

    class Solution {
        public List<List<Integer>> fourSum(int[] nums, int target) {
            Arrays.sort(nums);
            List<List<Integer>> res = new ArrayList<>();
            for(int i = 0; i < nums.length; i++){
                if(i > 0 && nums[i] == nums[i-1]) continue; //去掉已统计过的第一个重复值
                for(int j = i + 1; j < nums.length; j++){
                    if(j > i + 1 && nums[j] == nums[j-1]) continue; //去掉已统计过的第二个重复值
                    int remain = target - nums[i] - nums[j], L = j+1, R = nums.length - 1;
                    while(L <R){
                        if(L > j + 1 && nums[L] == nums[L-1]){ //去掉已统计过的第三个重复值
                            L++;continue;
                        }
                        if(nums[L] + nums[R] > remain) R--;
                        else if(nums[L] + nums[R] < remain) L++;
                        else res.add(Arrays.asList(nums[i], nums[j], nums[L++], nums[R--]));
                    }
                }
            }
            return res;
        }
    }
  • 相关阅读:
    做的一个HTML表白页面
    C语言--乱写C语言
    算法学习-带分数
    算法学习--兰顿蚂蚁
    算法学习---一个博弈问题
    数据结构学习--稀疏矩阵的三元组表示
    【Java初探外篇02】——关于静态方法与实例方法
    【Java初探实例篇01】——Java语言基础
    【教程知识向】——关于环境变量以及配置
    【java初探外篇01】——关于Java修饰符
  • 原文地址:https://www.cnblogs.com/luo-c/p/12912664.html
Copyright © 2020-2023  润新知