四数之和 - 力扣中等
admin
2024-03-16 01:07:53
0

题目链接

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、cd 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:
1<=nums.length<=200−109<=nums[i]<=109−109<=target<=1091 <= nums.length <= 200 \\ -10^9 <= nums[i] <= 10^9 \\ -10^9 <= target <= 10^9 \\ 1<=nums.length<=200−109<=nums[i]<=109−109<=target<=109

解题思路

思路一

双指针,时间复杂度为O(N3)O(N^3)O(N3)
排序
枚举前两个数字,剩下两个使用双指针lr枚举。

  • 如果nums[l] + nums[r] == target - nums[i] - nums[j],找到答案,更新lr
  • 如果nums[l] + nums[r] > target - nums[i] - nums[j],找到答案,r左移。
  • 如果nums[l] + nums[r] < target - nums[i] - nums[j],找到答案,l右移。

思路二

二分查找,时间复杂度为O(N3logN)O(N^3logN)O(N3logN)
排序
枚举前三个数字,查找第四个数target - nums[i] - nums[j] - nums[k]是否在数组里面。
很不幸,跑到最后一个测试用例超时。

注意溢出!

解题代码

思路一

#include
#include
#include
#include
using namespace std;class Solution {public:vector>ans;map>>vis;vector> fourSum(vector& nums, int target) {sort(nums.begin(),nums.end());for(int i=0;ifor(int j=i+1;jint l=j+1;int r=nums.size()-1;long long tmp_target = (long long)target-nums[i]-nums[j];while(lif(l==i||l==j){l++;continue;}if(r==i||r==j){r--;continue;}long long lr_sum = (long long)nums[l]+nums[r];if(lr_sum==tmp_target){if(vis[nums[i]][nums[j]][nums[l]]==0){vis[nums[i]][nums[j]][nums[l]]=1;vectorpath = {nums[i],nums[j],nums[l],nums[r]};ans.push_back(path);}l++;r--;continue;}if(lr_suml++;continue;}if(lr_sum>tmp_target){r--;continue;}}}}//        for(int i=0;i
//            vectorpath=ans[i];
//            for(int p=0;p
//                cout<//-2,-1,0,0,1,2vectornums = {0,0,0,0};int target = 1;Solution so = Solution();so.fourSum(nums,target);return 0;
}

思路二 (超时)

最后一个测试用例超时

#include
#include
#include
#include
using namespace std;class Solution {
public:vector>ans;map>>vis;int binary_search(vector&nums, int sidx, int target){int l=sidx;int r=nums.size()-1;while(lint m = (l+r)>>1;if(nums[m]==target)return m;if(nums[m]> fourSum(vector& nums, int target) {sort(nums.begin(),nums.end());for(int i=0;ifor(int j=i+1;jfor(int k=j+1;kif(vis[nums[i]][nums[j]][nums[k]])continue;long long d = (long long)target-nums[i]-nums[j]-nums[k];if(dnums[nums.size()-1])continue;int idx = binary_search(nums,k+1,d);if(idx!=-1){vis[nums[i]][nums[j]][nums[k]]=1;// vectorpath = {nums[i],nums[j],nums[k],nums[idx]};ans.push_back({nums[i],nums[j],nums[k],nums[idx]});
//                        for(int p=0;p
//                            cout<//-2,-1,0,0,1,2vectornums = {0,0,0,0};int target = 1;Solution so = Solution();so.fourSum(nums,target);return 0;
}

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...