【LeetCode 17】5.7四数之和

简介: 【LeetCode 17】5.7四数之和

一、题意

二、解题过程

在三数之和的基础上在套一层for循环:

15.三数之和

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int k = 0; k < nums.size(); k++) {
            // 这种剪枝是错误的,这道题目target 是任意值
            // if (nums[k] > target) {
            //     return result;
            // }
            // 去重
            if (k > 0 && nums[k] == nums[k - 1]) {
                continue;
            }
            for (int i = k + 1; i < nums.size(); i++) {
                // 正确去重方法
                if (i > k + 1 && nums[i] == nums[i - 1]) {
                    continue;
                }
                int left = i + 1;
                int right = nums.size() - 1;
                while (right > left) {
                    // nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出
                    if (nums[k] + nums[i] > target - (nums[left] + nums[right])) {
                        right--;
                    // nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出
                    } else if (nums[k] + nums[i]  < target - (nums[left] + nums[right])) {
                        left++;
                    } else {
                        result.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});
                        // 去重逻辑应该放在找到一个四元组之后
                        while (right > left && nums[right] == nums[right - 1]) 
                            right--;
                        while (right > left && nums[left] == nums[left + 1])
                            left++;
                        // 找到答案时,双指针同时收缩
                        right--;
                        left++;
                    }
                }
            }
        }
        return result;
    }
};
}
    }
    return result;
}

};


目录
相关文章
|
数据采集 机器学习/深度学习 数据挖掘
处理异常值:详细教程与实例分析
处理异常值:详细教程与实例分析
1634 0
|
运维 监控 网络协议
QT实现TCP通信:从基础到高级的全面解析
QT实现TCP通信:从基础到高级的全面解析
1953 0
|
8月前
|
缓存 移动开发 网络协议
Netty基础—5.Netty的使用简介
本文详细介绍了Netty服务端和客户端的启动流程、IO事件处理类及TCP粘包拆包问题。服务端启动通过ServerBootstrap配置线程模型、IO模型等,客户端通过Bootstrap完成连接配置。IO事件处理类关注关键方法如channelRead、channelActive等。针对TCP粘包拆包,分析了其原因与解决策略,包括消息定长、加分割符和带上长度字段等方式,并介绍了多种解码器如LineBasedFrameDecoder、DelimiterBasedFrameDecoder等。最后对比了Netty组件与传统BIO模型的对应关系,以及Java序列化的不足。
|
负载均衡 应用服务中间件 数据处理
Nginx学习使用
Nginx学习使用
194 0
|
Go
Go语言函数定义全攻略,这一篇就够了!
Go语言函数定义全攻略,这一篇就够了!
207 0
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(下)
Node.js Shell 脚本开发指南(下)
373 0
|
应用服务中间件 网络安全 数据安全/隐私保护
使用Python搭建服务器公网展示本地电脑文件
使用Python搭建服务器公网展示本地电脑文件
|
JavaScript Java 测试技术
基于ssm+vue.js的中国文学作品网站附带文章和源代码设计说明文档ppt
基于ssm+vue.js的中国文学作品网站附带文章和源代码设计说明文档ppt
88 0
|
Ubuntu Linux 网络安全
火墙术士:深入了解Linux系统防火墙命令
火墙术士:深入了解Linux系统防火墙命令
139 0