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

【Leetcode刷题记录】18.四数之和

18. 四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重
复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

这道题的解题思路和15. 三数之和是类似的,或者说就是三数之和。首先对数组nums进行排序,遍历数组中的元素nums[i]将其作为潜在的四元组的第一个元素,那么对于nums[i]后面的所有元素,可以看做另一个数组tempnums,在数组tempnums中寻找不重复的三元组使其满足tempnums[a]+tempnums[b]+tempnums[c]==target-nums[i],那么这不就是15. 三数之和吗?
代码

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int n = nums.size();
    vector<vector<int>> res;
    for (int i = 0; i < n - 3; i++) {
        if (i > 0 && nums[i - 1] == nums[i])
            continue;
        for (int j = i + 1; j < n - 2; j++) {
            if (j > i + 1 && nums[j] == nums[j - 1])
                continue;
            int l = j + 1, r = n - 1;
            while (l < r) {
                long sum = static_cast<long>(nums[i]) + nums[j] + nums[l] +
                    nums[r]; // 防止溢出
                if (sum < target) {
                    l += 1;
                } else if (sum > target) {
                    r -= 1;
                } else {
                    res.push_back({nums[i], nums[j], nums[l], nums[r]});
                    // 去重
                    while (l < r && nums[l] == nums[l + 1]) {
                        l += 1;
                    }
                    while (l < r && nums[r] == nums[r - 1]) {
                        r -= 1;
                    }
                    l += 1;
                    r -= 1;
                }
            }
        }
    }
    return res;
}

在这里插入图片描述

同样的,这里还有类似的提前终止条件,也就是:

  1. 最小值大于目标值,跳出循环
  2. 最大值小于目标值,跳过本次循环

完善后的代码如下:

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int n = nums.size();
    vector<vector<int>> res;
    for (int i = 0; i < n - 3; i++) {
        if (i > 0 && nums[i - 1] == nums[i])
            continue;
        // 提前终止
        if ((long)nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] >
            target)
            break;
        if ((long)nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] <
            target)
            continue;
        for (int j = i + 1; j < n - 2; j++) {
            if (j > i + 1 && nums[j] == nums[j - 1])
                continue;
            // 提前终止
            if ((long)nums[i] + nums[j] + nums[j + 1] + nums[j + 2] >
                target)
                break;
            if ((long)nums[i] + nums[j] + nums[n - 2] + nums[n - 1] <
                target)
                continue;
            int l = j + 1, r = n - 1;
            while (l < r) {
                long sum = static_cast<long>(nums[i]) + nums[j] + nums[l] +
                    nums[r]; // 防止溢出
                if (sum < target) {
                    l += 1;
                } else if (sum > target) {
                    r -= 1;
                } else {
                    res.push_back({nums[i], nums[j], nums[l], nums[r]});
                    // 去重
                    while (l < r && nums[l] == nums[l + 1]) {
                        l += 1;
                    }
                    while (l < r && nums[r] == nums[r - 1]) {
                        r -= 1;
                    }
                    l += 1;
                    r -= 1;
                }
            }
        }
    }
    return res;
}

在这里插入图片描述


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

相关文章:

  • macOS使用LLVM官方发布的tar.xz来安装Clang编译器
  • ComfyUI实现老照片修复——AI修复老照片(ComfyUI-ReActor / ReSwapper)解决天坑问题及加速pip下载
  • Linux Futex学习笔记
  • RocketMQ 系列文章
  • 为AI聊天工具添加一个知识系统 之69 详细设计 之10 三种中台和时间度量 之2
  • Cpp::静态 动态的类型转换全解析(36)
  • HTML5和CSS3拔高
  • mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录
  • 08.OSPF 特殊区域及其他特性
  • 嵌入式音视频开发——视频篇(一)
  • 【10】如何辨别IOS AP镜像
  • Ubuntu安装GitLab
  • 解锁FPGA的故障免疫密码
  • 【软件设计师中级】-笔记缩减版本-程序设计语言基础
  • 小马模拟器-第三方全街机游戏模拟器
  • MinIO的安装与使用
  • Linux下的编译工具 —— gcc、g++
  • GPT-4对话模型在客服中的应用与前景:开启智能客服新时代
  • Angular 2 表单深度解析
  • 双目立体校正和Q矩阵
  • Excel 技巧20 - 在Excel中输入内容时自动添加边框(★★)
  • 水果实体店品牌数字化:RWA + 智能体落地方案
  • 《浅聊规矩》
  • 智慧水务管网在线监测平台(Axure高保真原型)
  • 【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件
  • 模型合并:AI优化的创新利器