当前位置: 首页 > article >正文

力扣hot100——三数之和(双指针)

题目:三数之和
排序 + 双指针
本题的难点在于如何去除重复解。
算法流程:
1、特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 []2、对数组进行排序。
3、遍历排序后数组:
(1)若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。
(2)对于重复元素:跳过,避免出现重复解
(3)令左指针 L=i+1,右指针 R=n−1,当 L<R 时,执行循环:
当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解
若和大于 0,说明 nums[R] 太大,R 左移
若和小于 0,说明 nums[L] 太小,L 右移

作者:吴彦祖
链接:https://leetcode.cn/problems/3sum/solutions/39722/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码实现:
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回空数组
        if(nums.size()<3)
        {
            return vector<vector<int>>();
        }
        int l,r;
        vector<vector<int>> result; 
        //对数组进行排序。
        sort(nums.begin(), nums.end());
        for (int i = 0; i< nums.size(); i++)
        {
            l=i+1;
            r = nums.size()-1;
            //若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。
            if (nums[i]>0)
            {
                return result;
            }
            //难点:对于重复元素:跳过,避免出现重复解
            if (i>0 && nums[i] == nums[i-1])
            {
                continue;
            }
            while(r>l)
            {
                if ((nums[i]+nums[l]+nums[r]) > 0)
                {
                    r--;
                }
                else if((nums[i]+nums[l]+nums[r]) < 0)
                {
                    l++;
                }
                else
                {
                    vector<int> group;
                    group.push_back(nums[i]);
                    group.push_back(nums[l]);
                    group.push_back(nums[r]);
                    result.push_back(group);
                    //去重第三个元素
                    while(r>l && nums[r]==nums[r-1])
                        r--;
                    //去重第二个元素
                    while(r>l && nums[l]==nums[l+1])
                        l++;   
                    r--;
                    l++;
                }
            }   
        }
        return result;
    }
};

http://www.kler.cn/a/594565.html

相关文章:

  • SVN 泄露
  • 从模拟到现实:Sensodrive高精度力反馈技术赋能物流运输的高效与安全
  • 【OCR】使用Umi-OCR进行PDF文档的光学字符识别
  • 视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决
  • Git 使用笔记
  • Redis常用数据类型深度解析:从理论到最佳实践
  • 宇树科技纯技能要求总结
  • 群体智能优化算法-牛顿-拉夫逊优化算法(Newton-Raphson-Based Optimizer, NRBO,含Matlab源代码)
  • 企业数字化20项目规划建设方案微服务场景与数据应用(50页PPT)(文末有下载方式)
  • 图解AUTOSAR_CP_SOMEIP_TransportProtocol
  • TCP/Socket
  • lua垃圾回收
  • MySQL:建表,修改,删除
  • Tailwind CSS 学习笔记(三)
  • Swagger2 使用教程
  • 如何根据 CUDA 配置安装 PyTorch 和 torchvision(大模型 环境经验)
  • 【数据库备份】docker中数据库备份脚本——Mongo备份脚本
  • “消失的中断“
  • 解决linux mysql命令 bash: mysql: command not found 的方法
  • Unity 中实例化预制体的完整过程