• LeetCode-18-4Sum


    一、问题描述

      给定一个数组S,和一个int类型的数target,在S中寻找四个数,这四个数之和为target。返回一个vector<vector<int>>

      例子:S={1, 0, -1, 0, -2, 2},target = 0.返回结果为{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}

    二、问题解决

      最简单的思路是四层循环,这样不管是之前的3之和问题还是4之和问题都能解决,缺点就是比较费时,在leetcode上提交还可能超时。

      更好一点的方式是对数组进行排序之后,从两边逼近的方式。这样可以减少一层循环,3数之和就先确定一个数,4数之和就先确定两个数。本题下面的解法之中,固定i和j,让k和l冲两边逼近。

      这题比较麻烦的是去重复。

    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        if (nums.size() < 4) return result;
        sort(nums.begin(),nums.end());
        /*
        for (auto o : nums)
            cout << o;
        cout << endl;
        */
        for (int i = 0; i < nums.size() - 3; i++) {
         //去除重复
    while (i != 0 && nums.at(i - 1) == nums.at(i)) i++; for (int j = i + 1; j < nums.size() - 2; j++) {
           //去除重复
    while (j != i + 1 && j+1 <nums.size()-1&& nums.at(j-1) == nums.at(j)) j++; int k = j + 1, l = nums.size()-1; while (k < l) { //cout << i << j << k << l << endl; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) == target) { vector<int> temp; temp.emplace_back(nums.at(i)); temp.emplace_back(nums.at(j)); temp.emplace_back(nums.at(k)); temp.emplace_back(nums.at(l)); result.emplace_back(temp);
                //去除重复
    while (k + 1 < l && nums.at(k) == nums.at(k + 1)) k++; while (l-1 > k && nums.at(l) == nums.at(l - 1)) l--; k++; } if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) > target) l--; if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) < target) k++; } } } //result.erase(unique(result.begin(), result.end()),result.end()); return result; }
  • 相关阅读:
    写代码如坐禅:你是哪一类程序员
    关于鸿蒙的商业讨论
    为什么你总是“把天聊死”?
    生活不易,唯有努力
    如何用一句话激怒一名程序员?
    华为正式开源方舟编译器,开源了,它真的开源了!
    为什么HTTPS比HTTP更安全?
    《管理者必读12篇》购买方法
    程序员都在用的电脑小技巧,看一遍就学会,每天早下班一小时
    一位程序员的一天工作清单:5:30下班,5:30起床
  • 原文地址:https://www.cnblogs.com/likaiming/p/8280311.html
Copyright © 2020-2023  润新知