美文网首页
18. 四数之和

18. 四数之和

作者: gykimo | 来源:发表于2021-08-25 14:58 被阅读0次

题目:https://leetcode-cn.com/problems/4sum/
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

我的方法一,4指针

https://leetcode-cn.com/problems/3sum/
三个数之和类似,也是先排序,只是4个数时,先固定2个数,移动另外两个指针,让和等于target

复杂度

时间:O(nxnxn),因为3层循环
空间:O(1)

代码

注意点

  1. 去重
  2. 4个int相加可能存在超过int最大值的问题,所以求和时要转为64位(long long)
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;

        //O(nlogn)
        sort(nums.begin(), nums.end());
        int n = nums.size();

        long long sum;
        int left;
        int right;

        //total O(nxnxn)
        //O(n)
        for(int i = 0; i < n; i++) {
            if(i > 0) {
                if(nums[i] == nums[i - 1]){
                    continue;
                }
            }
            
            //O(n)
            for(int j = i + 1; j < n; j++) {
                if(j > i + 1) {
                    if(nums[j] == nums[j - 1]){
                        continue;
                    }
                }

                left = j + 1;
                right = n - 1;

                //O(n)
                while(left < right) {
                    if(left > j + 1) {
                        if(nums[left] == nums[left - 1]){
                            left++;
                            continue;
                        }
                    }
                    if(right < n - 1) {
                        if(nums[right] == nums[right + 1]){
                            right--;
                            continue;
                        }
                    }

                    sum = (long long)nums[i] + (long long)nums[j] + (long long)nums[left] + (long long)nums[right];
                    if(sum == target) {
                        vector<int> tmp;
                        tmp.push_back(nums[i]);
                        tmp.push_back(nums[j]);
                        tmp.push_back(nums[left]);
                        tmp.push_back(nums[right]);
                        ret.push_back(tmp);
                        left++;
                    }else if(sum < target) {
                        left++;
                    }else{
                        right--;
                    }
                }
            }
        }

        return ret;
    }
};

相关文章

  • 【Leetcode算法题】18. 四数之和

    By Long Luo 18. 四数之和[https://leetcode-cn.com/problems/4su...

  • LeetCode-18 四数之和

    题目:18. 四数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第18题四数之和,这是一道中等题。像...

  • 力扣每日一题:18.四数之和

    18.四数之和 https://leetcode-cn.com/problems/4sum/[https://le...

  • 18.四数之和

    18.四数之和 题目链接:https://leetcode-cn.com/problems/4sum/[https...

  • 18. 四数之和

    一、题目原型: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四...

  • 18. 四数之和

    知乎ID: 码蹄疾码蹄疾,毕业于哈尔滨工业大学。小米广告第三代广告引擎的设计者、开发者;负责小米应用商店、日历、开...

  • 18. 四数之和

    18.四数之和 给定一个包含n个整数的数组nums和一个目标值target,判断nums中是否存在四个元素a,b,...

  • 18.四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,...

  • 18. 四数之和

    一、题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素...

  • 18.四数之和

    自己解法 四数之和解题思路和三数之和类似,不过这个方式是固定前两个数字,后面两个数字用夹逼的方式向中间逼近,这样时...

网友评论

      本文标题:18. 四数之和

      本文链接:https://www.haomeiwen.com/subject/fdasiltx.html