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

力扣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;
    }
};

相关文章:

  • 每天五分钟玩转深度学习PyTorch:基于pytorch搭建LSTM和GRU模型
  • 深度优先搜索(DFS)与广度优先搜索(BFS)全面解析 + 经典算法题实战(Java实现)
  • leetcode106 从中序与后序遍历序列构造二叉树
  • Java学习笔记-XXH3哈希算法
  • Dify 项目开源大模型应用开发平台
  • deque
  • Linux基础开发工具--gdb的使用
  • 蓝桥杯青少组stema2025年3月9日scratch初级组真题——转动的图形
  • 除自身以外数组的乘积——面试经典150题(力扣)
  • 每天一道算法题-两数相加
  • C++编程语言特性
  • Android Jetpack Compose介绍
  • 238.除自身以外数组的乘积
  • 【sgHelp】自定义组件:网站、平台右下角的帮助助手、指导助理
  • app测试必须进行吗?需要进行哪些测试?
  • 混元视频与万相2.1全面对比分析
  • 嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充
  • 搭建个人博客教程(Hexo)
  • Django+celery+flower
  • 【文件分类助手V1.0b】支持自定义后缀分类整理及目录文档自动生成,方便大家美化管理自己的PC文件库支持Win10/11
  • 俄方确认普京与特朗普将于今晚通话
  • 调查:“网约摩的”上线起步价五六元,合规性及安全性引质疑
  • 上海青少年书法学习园开园:少年以巨笔书写《祖国万岁》
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 高飞已任南航集团党组副书记