算法-哈希表篇08-四数之和

news/2025/2/23 22:58:58

四数之和

力扣题目链接

题目描述

给你一个由 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
你可以按 任意顺序 返回答案 。

解题思路

这道题其实就是三数之和的进阶版,做完三数之和,这道题就会做了,就是在三数之和的前提上多加一层循环。
解题过程:

  • 先对数组进行排序;
  • 进行双循环遍历两个元素,在遍历这两个元素的时候都需要判断两次;
  • 条件一为自己与上一个元素不相等,否则跳过这个元素;(防止元素重复)
  • 条件二为该元素小于target或者小于0,否则直接结束循环;(这个元素已经大于target且大于0了,所以不可能组成一个答案)
  • 然后和三数之和一样,定义做右指针在剩下范围的左右两侧,向中间收缩,直到左右指针相遇或者出现答案;
  • 收缩时需要注意,如果出现和上一个元素相等的情况需要继续收缩,防止答案重复;
  • 当出现所需要的答案时,保存在答案数组中即可。

题解

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] > target && nums[i] > 0){
                break;
            }
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }

            for(int j = i + 1; j < nums.size(); j++){
                if(nums[i] + nums[j] > target && nums[i] + nums[j] > 0){
                    break;
                }
                if(j > i + 1 && nums[j] == nums[j - 1]){
                    continue;
                }

                int l = j + 1, r = nums.size() - 1;
                while(l < r){
                    if((long)nums[i] + nums[j] + nums[l] + nums[r] == target){
                        ans.push_back({nums[i], nums[j], nums[l], nums[r]});
                        while(l < r && nums[r] == nums[r - 1]){
                            r--;
                        }
                        while(l < r && nums[l] == nums[l + 1]){
                            l++;
                        }
                        r--;
                        l++;
                    }
                    else if((long)nums[i] + nums[j] + nums[l] + nums[r] > target){
                        r--;
                    }
                    else if((long)nums[i] + nums[j] + nums[l] + nums[r] < target){
                        l++;
                    }
                }
            } 
        } 

        return ans;
    }
};

总结

在被三数之和反复折磨之后,算是理解了枝剪去重的操作,这次写四数之和的整体思路是对的,但是还是出现了很多小问题。力扣不能debug振刀好难受啊。


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

相关文章

Python 循环中的隐藏宝藏:Else 子句深度剖析

在 Python 编程里&#xff0c;循环结构是基础且高频使用的部分&#xff0c;不过其中的 else 子句却常被大家忽略。本文将深入、全面地解析 Python 循环中 else 子句的工作原理、使用方法&#xff0c;通过丰富的代码示例、直观的图表&#xff0c;以及与其他相关知识点的对比&…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法&#xff1a;rustup update stable

51c大模型~合集69

我自己的原文哦~ https://blog.51cto.com/whaosoft/12221979 #7项基于SAM万物分割模型研究工作 1、CC-SAM: SAM with Cross-feature Attention and Context for Ultrasound Image Segmentation #ECCV2024 #SAM #图像分割 #医学图像 Segment Anything Model (SAM) 在自…

算法:选择排序(以排队为例)

举个栗子&#x1f330;&#xff1a;体育课排队 假设体育老师要按身高从高到矮给10个同学排队&#xff08;降序排序&#xff09;&#xff0c;老师会这样做&#xff1a; 第1轮&#xff1a;找全班最高的同学&#xff0c;让他站在第1个位置第2轮&#xff1a;在剩下的9人中找最高的…

使用Hardhat实现ERC20 代币合约详解

ERC20 代币合约详解 &#x1f4b0; 1. 合约概览 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20;import "openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "MTK") {_min…

【进阶】redis篇

redis是什么 nosql not only sql(不仅仅是sql) 泛指非关系型数据库 一般把非关系型数据库称为nosql数据库. redis mongodb redis是一个nosql类型的数据库(非关系型数据库),数据在内存中以键值对形式存储. 读写速度快,也提供数据持久化方式. 一般最常用的场景就是把redis用…

基于机器学习的人脸识别方法探讨

机器学习在人脸识别领域的应用是计算机视觉中最成功的案例之一。通过机器学习算法,尤其是深度学习技术,人脸识别的准确率和效率得到了显著提升。以下是机器学习在人脸识别中的应用、关键技术、流程及挑战的详细说明。 1. 机器学习在人脸识别中的应用 (1) 人脸检测 任务:从…

第三章 STM32 IIC驱动

1、IIC的速度&#xff1a;标准模式100Kbit/s、快速模式下400Kbit/s、高速模式下3.4Mbit/s 2、理论上IIC地址是8位&#xff0c;其中1位广播地址&#xff0c;7位地址&#xff0c;2^7128&#xff0c;理论上IIC可以挂载128个器件。但IIC总线上可挂接的设备数量受总线的最大电容400p…