【C++算法】9.双指针_四数之和

news/2024/10/5 15:35:24 标签: c++, 算法, 开发语言

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

18.四数之和


题目描述:

1d9e7dd9cd71e7b5bc1afe93fc294f66


解法

解法一:排序+暴力枚举+利用set去重

解法二:排序+双指针

  1. 从左往右依次固定一个数a
  2. a后面的区间里,利用“三数之和”找到三个数,使这三个数的和等于target-a即可
  3. 在上面一步的“三数之和”里面,我们先固定一个b,在b后面的区间里面,利用“双指针”找到两个数,使这两个数的和等于target-a-b即可。

处理细节:

  1. 不重

    • 双指针要跳过相同元素
    • b要跳过相同元素
    • a要跳过相同元素
  2. 不漏

    双指针遇到合适的数继续往后走


C++ 算法代码:

class Solution 
{
    public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;
        // 1. 排序
        sort(nums.begin(), nums.end());
        // 2. 利用双指针解决问题
        int n = nums.size();
        for(int i = 0; i < n; ) // 固定数 a
        {
            // 利用 三数之和
            for(int j = i + 1; j < n; ) // 固定数 b
            {
                // 双指针
                int left = j + 1, right = n - 1;
                long long aim = (long long)target - nums[i] - nums[j];//aim = target - a - b
                while(left < right)
                {
                    int sum = nums[left] + nums[right];
                    if(sum < aim) {
                        left++;
                    }
                    else if(sum > aim) {
                        right--;
                    }
                    else
                    {
                        ret.push_back({nums[i], nums[j], nums[left++], 
                                       nums[right--]});//ret数组存放最终结果
                        // 去重一
                        while(left < right && nums[left] == nums[left - 1]) { 
                            left++;
                        }
                        while(left < right && nums[right] == nums[right + 1]) {
                            right--;
                        }
                    }
                }
                // 去重二
                j++;
                while(j < n && nums[j] == nums[j - 1]) {
                    j++;
                }
            }
            // 去重三
            i++;
            while(i < n && nums[i] == nums[i - 1]) {
                i++;
            }
        }
        return ret;
    }
};

图解

nums=[1,0,-1,0,-2,2]

target=0

  1. n=6,i=0,j=1,left=2,right=5,aim=-1

cc34bc0990edc6d3107deb9888d1802b

  1. left<right,sum=-1+2=1>aim,right--

8561104e892c6d5a435b7abae398630c

  1. left<right,sum=-1-2=-3<aim,left++

34a98b82163eb633d10ae3ed2a10f0d7

  1. left<right,sum=0-2=-2<aim,left++

  2. 不满足循环条件,跳出while循环,进入去重2j++

e4ce917585712b312259d149ca9e16ec

  1. n=6,i=0,j=2,left=3,right=5,aim=0

  2. 后面的步骤类似,就不多赘述了。


http://www.niftyadmin.cn/n/5691019.html

相关文章

mybatis如何与spring的结合

1.前言 在现在的java项目开发中&#xff0c;MyBatis和Spring是两个非常流行的框架。MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。而Spring则是一个广泛使用的开源框架&#xff0c;用于构建企业级应用程序。将这两个框架整合在一起&…

Spring Boot大学生就业招聘系统的设计与优化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

FL Studio 24.1.2.4381中文版免费下载及FL Studio 24最新使用学习教程

家好呀&#xff0c;作为一个资深的音乐爱好者和制作人&#xff0c;今天我要安利一个我最近超级痴迷的数字音频工作站软件——FL Studio24.1.2.4381中文版。这款产品可是让我的音乐创作之路如虎添翼&#xff0c;快来跟我一起看看它的炫酷功能吧&#xff01; 最近接到很多小伙伴的…

Django学习笔记九:RESTAPI添加用户认证和授权

在Django REST Framework中添加用户认证和授权&#xff0c;通常涉及以下几个步骤&#xff1a; 1. 认证&#xff08;Authentication&#xff09; 认证是指确定用户身份的过程。Django REST Framework提供了多种认证方式&#xff1a; Token Authentication&#xff1a;通过一个…

【Linux】-----进程第二弹(优先级,环境变量)

目录 一、进程优先级 是什么 为什么要有&#xff1f; 查看进程优先级 修改进程优先级 二、环境变量 命令行参数 概念 常见环境变量 查看环境变量 配置环境变量 内存级别修改&#xff08;命令行修改&#xff0c;暂时&#xff09; ①拷贝到系统路径下 ② 路径添加…

Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系

理清 Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系 在开发图形界面应用时&#xff0c;特别是在使用 Qt 框架时&#xff0c;开发者可能会接触到多个概念&#xff0c;如 Qt 3D、QtQuick、QtQuick 3D 和 QML。这些术语分别代表了 Qt 中不同的模块或技术&#xff0c;但由于它们的功能…

大学生就业市场:Spring Boot招聘系统的设计与实现

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

零样本VS小样本

建立客户端 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )2.零样本 response client.chat.completions.create(model"gpt-3.5-turbo",messages[{"role": "user","content": &…