美文网首页
双指针应用八:四数之和

双指针应用八:四数之和

作者: 程一刀 | 来源:发表于2021-05-11 10:50 被阅读0次

题目地址: https://leetcode-cn.com/problems/4sum/

题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
参考代码:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i< nums.size(); i++) {
//            if(nums[i] > target) { // 不能加这个,-3,-4,-5,0,0,target 为 -7,如果 target >= 0, 可以 加这个
//                break;
//            }
            if (i>0&&nums[i] ==nums[i-1]) {
                continue;
            }
            for (int j = i + 1;j<nums.size(); j++) {
                if (j>i+1 && nums[j]==nums[j-1]) {
                    continue;
                }
                int left = j + 1;
                int right = nums.size()-1;
                while (left< right) {
                    int value = nums[i] + nums[j] +  nums[left] + nums[right];
                    
                    if (value == target) {
                        result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
                        
                        while (left+1<nums.size() &&nums[left] == nums[left+1]) {
                            left ++;
                        }
                        while (right-1>left && nums[right] == nums[right-1]) {
                            right--;
                        }
                        left++;
                        right--;
                    } else if (value > target){
                        right--;
                        
                    } else {
                        left++;
                    }
                }
            }
        }
        return  result;
    }
};

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
//    vector<int> data = {-1,0,1,2,-1,-4};
//    vector<int> data = {0,0,0,0};
//    vector<int> data = {0};
//    Solution1().threeSum(data);
//    [1,-2,-5,-4,-3,3,3,5]
//    -11
    vector<int> data = {1,-2,-5,-4,-3,3,3,5};
    // {-5,-4,-3,-2,}
    Solution().fourSum(data, -11);
    return 0;
}

参考链接: https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0018.%E5%9B%9B%E6%95%B0%E4%B9%8B%E5%92%8C.md

相关文章

  • 双指针应用八:四数之和

    题目地址: https://leetcode-cn.com/problems/4sum/[https://leet...

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • LeetCode-18 四数之和

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

  • 双指针应用七:三数之和

    题目地址: https://leetcode-cn.com/problems/3sum/[https://leet...

  • 双指针总结

    左右指针 主要解决数组中的问题:如二分查找 盛最多水的容器 三数之和 四数之和 最接近三数之和 快慢指针 主要解决...

  • 双指针--三数之和

    目录[https://www.jianshu.com/p/85e18c21317a] 题号[https://lee...

  • 双指针法(算法)

    案例: 盛最多水的容器、三数之和、最接近的三数之和 双指针法一般对应于有序数组的情况,通过调节指针(左右移动),...

  • LeetCode咸鱼记录

    15. 三数之和 先排序,然后用双指针往中间移动查找符合条件的数。

  • [双指针学习-待补充]最接近三数之和

    依旧是求三数之和,这个暴力可解但是最好的方法是双指针。lc16 双指针 待补充学习

  • 常用算法

    以下题号如无说明表示在中文leetcode上的题号双指针:15(三数之和)

网友评论

      本文标题:双指针应用八:四数之和

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