[C国演义] 第十三章

这篇具有很好参考价值的文章主要介绍了[C国演义] 第十三章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三数之和

力扣链接
[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl

根据题目要求:

  1. 返回的数对应的下标各不相同
  2. 三个数之和等于0
  3. 不可包含重复的三元组 – – 即顺序是不做要求的
    如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组
  4. 输出答案顺序不做要求

暴力解法: 排序 + 3个for循环 + 去重 — — N^3, 肯定超时
优化: 排序 + 双指针 + 去重 — — N^2
优化的具体思路:
固定一个数, 记作a; 在剩余的空间里面找和为 -a的两个数(由于是排好序的, 所以使用双指针)
去重有两种方法:
1.set去重
2 在循环内部缩小空间 — — 非常值得我们去尝试

  1. set去重
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {

         // 排序
         sort(nums.begin(), nums.end());

        // 记录结果
        vector<vector<int>> res; 

         // 固定一个数 + 双指针
         int n = nums.size();
         for(int i = 0; i < n; i++) // 固定一个数
         {
             // 双指针优化
             int left = i+1, right = n-1;
             int targt = -nums[i];

             while(left < right)
             {
                 int sum = nums[left] + nums[right];
                 if(sum < targt)
                 {
                     left++;
                 }
                 else if(sum > targt)
                 {
                     right--;
                 }
                 else
                 {
                     res.push_back({nums[i], nums[left], nums[right]});
                     left++;
                     right--;
                 }
             }
         }

        // 去重
         set<vector<int>> result(res.begin(), res.end());
         res.clear();

         for(auto e : result)
         {
             res.push_back(e);
         }

         return res;
    }
};

[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl
上面的运行结果太慢了, 我们尝试一下 缩小空间去重👇👇👇

  1. 缩小空间去重
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
         // 排序
         sort(nums.begin(), nums.end());

        // 记录结果
        vector<vector<int>> res; 

         // 固定一个数 + 双指针
         int n = nums.size();
         for(int i = 0; i < n;) // 固定一个数
         {
             // 双指针优化
             int left = i+1, right = n-1;
             int targt = -nums[i];

             while(left < right)
             {
                 int sum = nums[left] + nums[right];
                 if(sum < targt)
                 {
                     left++;
                 }
                 else if(sum > targt)
                 {
                     right--;
                 }
                 else
                 {
                     res.push_back({nums[i], nums[left], nums[right]});
                     left++;
                     right--;

                    // 去重left 和 right
                     while(left < right && nums[left] == nums[left-1])  left++;
                     while(right > left && nums[right] == nums[right+1])  right--;

                 }
             }
			
			// 去重i
             i++;
             while(i < n && nums[i] == nums[i-1])  i++;
         }

         return res;
    }
};

[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl
[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl
[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl

[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl

四数之和

力扣链接
[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl

这一题就跟上面的题目相似, 思路也很相似: 排序 + 固定两个数, 双指针优化 + 去重. 当然, 我们这里的去重逻辑也是 缩小空间去重

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        sort(nums.begin(), nums.end());

        vector<vector<int>> res;

        int n = nums.size();
        // 选定一个数, 内部用三数之和
        for(int i = 0; i < n;)
        {
            // 选定一个数, 内部使用双指针优化
            for(int j = i+1; j < n;)
            {
                int left = j+1, right = n-1;
                long int tar = target - (long int)(nums[i]+nums[j]);

                while(left < right)
                {
                    long int cur = nums[left] + nums[right];

                    if(cur < tar)  left++;
                    else if(cur > tar)  right--;
                    else
                    {
                        res.push_back({nums[i], nums[j], nums[left], nums[right]});
                        left++, right--;

                        // 去重left 和 right
                        while(left < right && nums[left] == nums[left-1])  left++;
                        while(right > left && nums[right] == nums[right+1])  right--;

                    }
                }

                // j的去重
                j++;
                while(j < n && nums[j] == nums[j-1])  j++;
            }

            // i的去重
            i++;
            while(i < n && nums[i] == nums[i-1])  i++;
        }

        return res;
    }
};

[C国演义] 第十三章,刷题录,c语言,算法,leetcode,c++,stl


号令风霆迅,天声动北陬。
长驱渡河洛,直捣向燕幽。
马蹀阏氏血,旗袅可汗头。
归来报明主,恢复旧神州。 — — [宋] 岳飞 <送紫岩张先生北伐>
文章来源地址https://www.toymoban.com/news/detail-714399.html

到了这里,关于[C国演义] 第十三章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NodeJs第十三章 cookie

    假设服务器有一个接口,通过请求这个接口,可以添加一个管理员 但是,不是任何人都有权力做这种操作的 那么服务器如何知道请求接口的人是有权力的呢? 答案是:只有登录过的管理员才能做这种操作 可问题是,客户端和服务器的传输使用的是http协议,http协议是无状态

    2024年01月19日
    浏览(34)
  • 《微服务实战》 第十三章 JWT

    【项目实战】Spring boot整合JWT、Vue案例展示用户鉴权 【微服务实战】JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。 基于JSON的开发标准 用户信息加密到token里,服务器不保存任何用户信息 在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式

    2024年02月06日
    浏览(77)
  • 精读《图解密码技术》——第十三章 PGP

      PGP是一款由个人编写的密码软件,PGP是为了保护处于极端状况下的人们的隐私而开发的,如果这些人的信息被窃听,那么可能是性命攸关的大事件。   OpenPGP是对密文和数字签名格式进行定义的标准规格。   GNU Privacy Guard ( GnuPG、GPG)是一款基于OpenPGP标准开发的密码学

    2024年02月05日
    浏览(54)
  • 第十三章_Redis中的BigKey

    MoreKey案例 大批量往redis里面插入2000W测试数据key  Linux Bash下面执行,插入100W # 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中 for((i=1;i=100*10000;i++)); do echo \\\"set k$i v$i\\\" /tmp/redisTest.txt ;done; 通过redis提供的管道--pipe命令插入100W大批量数据 结合自己

    2024年02月03日
    浏览(45)
  • 第十三章,枚举与泛型例题

    例题1 结果   例题2 结果   例题3 结果     例题4 结果 例题5  结果 例题6  结果 例题7  结果 例题8  结果

    2024年02月06日
    浏览(48)
  • 第十三章 Unity 移动和旋转(上)

    移动和旋转是游戏对象最频繁地操作。我们上个章节简单介绍了Cube的移动和旋转。移动是修改transform的position属性,旋转是修改transform的eulerAngles(欧拉角)属性,两者属性值均可以使用Vector3向量来实现。需要大家注意的是,transform.forward和Vector3.forward的区别(参考坐标系是

    2024年02月05日
    浏览(54)
  • Vue3——第十三章(插槽 Slots)

    这里有一个 FancyButton 组件,可以像这样使用: 而 FancyButton 的模板是这样的: slot 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 最终渲染出的 DOM 是这样: 通过使用插槽, FancyButton 仅负责渲染外层的 button (以及相应的样式),而

    2024年02月07日
    浏览(56)
  • 《TCP IP网络编程》第十三章

    Linux 中的 send recv:          send 函数定义:         recv 函数的定义:         send 和 recv 函数的最后一个参数是收发数据的可选项,该选项可以用位或(bit OR)运算符(| 运算符)同时传递多个信息。send recv 函数的可选项意义: MSG_OOB:发送紧急消息 :     

    2024年02月15日
    浏览(43)
  • 第十三章 opengl之模型(导入3D模型)

    使用Assimp并创建实际的加载和转换代码。Model类结构如下: Model类包含一个Mesh对象的vector,构造器参数需要一个文件路径。 构造器通过loadModel来加载文件。私有函数将会处理Assimp导入过程中的一部分,私有函数还存储了 文件路径的目录,加载纹理时会用到。 Draw函数的作用:

    2024年02月05日
    浏览(48)
  • 《c++ primer笔记》第十三章 拷贝控制

    1.1拷贝构造函数 ​ 如果一个构造函数的第一个参数是自身类类型的 引用 ,且任何额外参数都由默认值,则此构造函数成为拷贝构造函数。 拷贝构造函数在某些情况下会被隐式地使用,所以不能定义为 expicit 。 合成拷贝构造函数 ​ 合成某某函数 一般出现在我们没定义该函

    2023年04月25日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包