LeetCode15三数之和 容易理解版本
创始人
2024-05-29 21:01:43
0

题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

思路:

逐个遍历数组,确定第一个元素后,剩下的两个数字就是和为 target - nums[i] 的两个数字了,因此将确定元素的下一个索引和target-nums[i]传给两个数相加和为某个数的函数,由该函数返回所有满足和为target-nums[i]的二维vector,将返回的结果遍历,如果结果不为空,每次循环将刚在确定的第一个数加进这个一维vector中组成一个和为0的三元组,再将这个三元组加入到vector中,在最后需要跳过第一个数组重复的情况,否则可能会出现重复的结果。

vector> twoSumtarget(vector& nums,int start,int target) {int left = start;int right = nums.size() - 1;vector> res;while (leftint leftnum = nums[left];int rightnum = nums[right];int sum = nums[left] + nums[right];if (sum while (left < right&&nums[left] == leftnum) {left++;}}else if (sum > target) {while (left < right && nums[right] == rightnum) {right--;}}else if(sum == target){res.push_back({ nums[left],nums[right] });while (left < right && nums[left] == leftnum) {left++;}while (left < right && nums[right] == rightnum) {right--;}}}return res;
}vector> threeSumtarget(vector& nums, int target) {sort(nums.begin(),nums.end());int numsize = nums.size();vector> res;for (int i = 0; i < numsize;i++) {vector> tuples = twoSumtarget(nums,i+1,target-nums[i]);//如果存在满足条件的二元组,再加上nums[i]结果就是三元组for (vector& tuple:tuples) {tuple.push_back(nums[i]);res.push_back(tuple);}//跳过第一个数字重复的情况,否则可能会出现重复结果while (i < numsize - 1 && nums[i] == nums[i + 1]) i++;}return res;
}int main() {vector c{ -1,0,1,2,-1,4 };int target = 0;vector> result= threeSumtarget(c,target);for (vector>::iterator it = result.begin(); it != result.end();it++) {for (vector::iterator pit = (*it).begin(); pit != (*it).end();pit++) {cout<<*pit<<" ";}cout << endl;}return 0;
}

相关内容

热门资讯

安卓系统小额扣款在哪看 你有没有遇到过这种情况:手机里突然少了点零花钱,却不知道是哪个APP偷偷扣了款?别急,今天就来教你怎...
安卓8系统兼容面具吗 你有没有想过,你的安卓8系统手机能不能装上那些酷炫的面具应用呢?这可是个让人心头一紧的问题,毕竟谁不...
安卓手机系统升级流程,从准备到... 你有没有发现,你的安卓手机最近总是时不时地提醒你系统要升级啦?是不是有点小激动,又有点小紧张呢?别急...
51虚拟机安卓系统,功能解析与... 你有没有想过,在手机上也能体验到电脑的强大功能呢?没错,这就是51虚拟机安卓系统的魅力所在!今天,就...
王者安卓苹果互通系统,安卓苹果... 哇,你知道吗?最近在游戏界可是掀起了一股热潮,那就是《王者荣耀》的安卓和苹果互通系统!是不是听起来就...
黑苹果单系统安卓,黑苹果单系统... 亲爱的读者们,你是否曾梦想过拥有一台既能运行Windows系统,又能畅玩安卓应用的电脑呢?今天,就让...
安卓系统怎么开启隐藏键,安卓系... 你有没有发现安卓手机里藏着一些小秘密呢?比如那些隐藏的键,它们就像手机里的宝藏,等着你去发现和开启。...
华为安卓系统开机页面,科技美学... 亲爱的读者,你是否曾好奇过,当你按下华为手机的开机键,那独特的安卓系统开机页面背后隐藏着怎样的故事?...
安卓系统手机号标记,一键识别号... 你有没有发现,现在用安卓系统手机的人越来越多了呢?手机号标记这个功能,简直就是咱们日常生活中的小帮手...
鸿蒙5.0系统和安卓区别,系统... 你知道吗?最近手机圈子里可是炸开了锅,因为华为的新操作系统鸿蒙5.0系统终于发布了!这可是个大新闻,...
安装安卓系统套件的软件,软件应... 你有没有想过,给你的手机换换口味?是的,就是那种从iOS跳到安卓的感觉,是不是听起来就有点小刺激呢?...
安卓系统各组件怎么安装,安卓系... 你有没有想过,安卓系统里那些神奇的组件是怎么安装到你的手机上的呢?是不是觉得这个过程神秘又复杂?别急...
安卓系统cookie设置阻止,... 你有没有发现,在使用安卓手机的时候,有时候网页会偷偷地跟踪你的浏览记录呢?别担心,今天就来教你怎么设...
2023安卓最流畅系统,性能与... 你有没有发现,手机用久了,就像人一样,开始变得“臃肿”起来?尤其是安卓系统,有时候感觉就像一个老态龙...
安卓子系统的终极玩法,终极玩法... 你有没有发现,安卓系统就像一个巨大的宝藏库,里面藏着无数好玩的游戏和实用的应用?今天,就让我带你一起...
安卓系统主题英文名,探索安卓系... 你有没有发现,手机里的世界其实可以变得五彩斑斓?没错,就是那个我们每天离不开的安卓系统,它就像一个巨...
安卓系统怎么调亮屏幕,安卓系统... 手机屏幕暗暗的,是不是觉得看东西都费劲?别急,今天就来教你怎么轻松调亮安卓系统的屏幕亮度,让你的手机...
手机升级安卓系统包,畅享智能生... 亲爱的手机用户们,你是否也和我一样,对手机升级安卓系统包充满了好奇和期待呢?每次手机系统一更新,我们...
新款cs75安卓系统,新款CS... 你有没有听说?最近汽车界可是炸开了锅,因为一款全新的车型——新款CS75,竟然搭载了安卓系统!这可不...
安卓系统送ios皮肤,体验不一... 你知道吗?最近在手机圈里可是掀起了一股热潮呢!那就是——安卓系统送iOS皮肤。是不是听起来有点不可思...