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

每天一道算法题【蓝桥杯】【四数之和】

题目

思路

固定一个数转化为三数之和问题
再固定一个数转化为两数之和问题

注意

两数之和target2=target-a-b
target2和target都要设成long long类型避免超限

#define _CRT_SECURE_NO_WARNINGS 1
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        sort(nums.begin(), nums.end());//先排序降低时间复杂度

        int n = nums.size();

        int a = 0, b = a + 1, left = b + 1, right = n - 1;//先固定a,其他三数之和等于target-a
        //再固定b,使得四数之和变成两数之和的问题,两数之和等于target-a-b
        long long t2 = 0;//注意t2可能会因为target-a-b超出int范围,故使用long long类型
        while (a <= n - 4)
        {
            b = a + 1, left = b + 1, right = n - 1;
            while (b <= n - 3)
            {
                t2 = (long long)target - nums[a] - nums[b];//注意t2可能会因为target-a-b超出int范围,故使用long long类型强制转换target
                left = b + 1, right = n - 1;
                while (left < right)
                {
                    if (nums[left] + nums[right] < t2) left++;
                    else if (nums[left] + nums[right] > t2) right--;
                    else
                    {
                        ret.push_back({ nums[a],nums[b],nums[left],nums[right] });//找到结果后插入ret数组
                        left++; right--;//使得找到一个结果之后接着找
                        while (left < right && nums[left] == nums[left - 1])left++;
                        while (left < right && nums[right] == nums[right + 1])right--;//跳过重复的数
                    }
                }
                b++;
                while (b < left && nums[b] == nums[b - 1])b++;//跳过重复的数
            }
            a++;
            while (a < b && nums[a] == nums[a - 1])a++;//跳过重复的数
        }
        return ret;

    }
};

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

相关文章:

  • 李沐《动手学深度学习》——14.9. 用于预训练BERT的数据集——wiki数据集问题以及存在的其他问题
  • 基于一致性哈希的分布式Top-K
  • 基于Flink SQL的实时指标多维分析模型
  • python办公自动化--数据可视化(pandas+matplotlib)--生成条形图和饼状图
  • Spring MVC 全面解析
  • 第六次CCF-CSP认证(含C++源码)
  • Elasticsearch 入门教学:从零开始掌握分布式搜索引擎
  • ESP32的IDF开发学习-移植lvgl并显示简单ui(以gc9a01为例)
  • 内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射
  • 蓝桥杯备考:离散化详解
  • 数据结构:有序表的插入
  • MongoD和关系型数据库相关概念的对应
  • PyTorch 张量数据类型定义和转换
  • 【Linux内核系列】:深入理解缓冲区
  • 在ubuntu 24 命令行 下,制作无人值守ubuntu-24.04.2-desktop 桌面版安装U盘
  • 《深入理解Linux:高效崩溃分析与实时栈回溯技巧》
  • 操作系统知识点25
  • OCR图片识别原理
  • C++:面向对象之多态(运算符重载)
  • AF3 squeeze_features函数解读