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

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

四数之和

力扣题目链接

题目描述

给你一个由 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振刀好难受啊。

相关文章:

  • GEE | 基于ASTER影像提取矿物指数
  • 【算法】788. 逆序对的数量
  • DeepSeek 的架构思维与java架构的思考
  • Redis7——基础篇(六)
  • Redis常见数据结构及其在项目中用法
  • 软件测试工程师职业规划:从入门到卓越
  • 【Deepseek】Linux 本地部署 Deepseek
  • 第37天:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类
  • 【图像处理】:两幅图中相同区域的相似度比较
  • 矩阵加减乘除的意义与应用
  • 初尝git自结命令大全与需要理解的地方记录
  • 【爬虫 JS 逆向实战 - 请求载荷加密详细教程】
  • 5 - 库函数
  • DeepSeek 基础使用文档介绍
  • 大模型训练微调工具对比:Megatron-DeepSpeed、Axolotl、DeepSpeed、Accelerate和Unsloth
  • Unity 全局屏幕点击特效
  • 后端性能测试优化案例
  • 【deepseek】本地部署后api接口的封装
  • 如何看nginx.conf文件?
  • OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData
  • 交行一季度净利253.72亿元增1.54%,不良率微降
  • 河北:开展领导干部任性用权等形式主义官僚主义问题专项整治
  • 财政部农业农村司司长吴奇修接受纪律审查和监察调查
  • 外交部:欢迎外国朋友“五一”来中国
  • 大学2025丨专访南开人工智能学院院长赵新:人工智能未来会变成通识类课程
  • 人民时评:投资于人,促高质量充分就业