【力扣刷题 | 第五天】

news/2024/11/27 22:54:54/

目录

前言:

15. 三数之和 - 力扣(LeetCode)

18. 四数之和 - 力扣(LeetCode)

结束:


前言:

今天两道题类型相似,解法思路一致,都利用了双指针技术。



15. 三数之和 - 力扣(LeetCode)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

解法1:哈希表法:

我们仍然可以建立一个map表来存储a+b的值以及a和b的值,再次遍历整个数组,如果利用find函数能找到一个c等于(-(a+b)),那么我们就往数组中存储这三个数字,但是这种方法对于去重来讲太过于复杂因此我们不推荐使用这种方法。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[j], c = -(a + b)for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么不可能凑成三元组if (nums[i] > 0) {break;}if (i > 0 && nums[i] == nums[i - 1]) { //三元组元素a去重continue;}unordered_set<int> set;for (int j = i + 1; j < nums.size(); j++) {if (j > i + 2&& nums[j] == nums[j-1]&& nums[j-1] == nums[j-2]) { // 三元组元素b去重continue;}int c = 0 - (nums[i] + nums[j]);if (set.find(c) != set.end()) {result.push_back({nums[i], nums[j], c});set.erase(c);// 三元组元素c去重} else {set.insert(nums[j]);}}}return result;}
};

解法2:双指针法

我们可以先对数组进行排序,然后以此遍历这个数组,每一次遍历的时候建立两个指针:left指针和right指针,left指针指向遍历数组的后一位元素,right指针指向末尾元素:

 此时我们固定住遍历指针,对left指针和right指针进行以下操作:
   1.计算nums[遍历指针]+nums[left]+nums[right]的和。

        2.如果三者的和大于零,因为已经进行了排序,我们就移动right指针,使和减小。

        3.如果三者的和小于零,就移动left指针,使和增大。

如此操作之下,我们最终无非得到两个结果

1.得到了两个left和right指针指向的值使得其加上遍历指针指向的值为0,则为我们要寻找的答案。

2.无法找到left和right指针能使其值加上遍历指针指向值后的结果为0,则该值没有答案。

去重操作:
因为我们在之前已经进行过排序,因此重复的数字一定是在一起的。如果遇到了重复的数字,我们就让指针向后指,直到指针指向的值与指针+1指向的值不相等(因为相同的数字会放在一起,所以如果nums[i]!=nums[i+1],那么nums[i]在数组中肯定没有重复元素)。

对遍历指针去重:

 if (i > 0 && nums[i] == nums[i - 1]){continue;}

对left和right指针去重:

while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;

完整代码:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){if(nums[i]>0){return result;}int left=i+1;int right=nums.size()-1;int sums=0;if (i > 0 && nums[i] == nums[i - 1]){continue;}while(left<right){if(nums[i]+nums[left]+nums[right]>0){right--;}else if(nums[i]+nums[left]+nums[right]<0){left++;}else if(nums[i]+nums[left]+nums[right]==0){result.push_back(vector<int>{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;}
};

18. 四数之和 - 力扣(LeetCode)

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

双指针解法:
与上一题思路解法一致,只不过又多了一个外层循环,也就是说我们这次要固定两个遍历指针

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> result;for(int k=0;k<nums.size();k++){   if(nums[k]>target && nums[k]>0&&target>0){continue;}   if (k > 0 && nums[k] == nums[k - 1]){continue;}for(int i=k+1;i<nums.size();i++){if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {break;}// 对nums[i]去重if (i > k + 1 && nums[i] == nums[i - 1]) {continue;}int left=i+1;int right=nums.size()-1;int sums=0;while(left<right){if((long)nums[k]+nums[i]+nums[left]+nums[right]>target){right--;}else if((long)nums[k]+nums[i]+nums[left]+nums[right]<target){left++;}else if((long)nums[k]+nums[i]+nums[left]+nums[right]==target){result.push_back(vector<int{nums[i],nums[left],nums[right],nums[k]);while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;right--;left++;}}}}return result;}
};

结束:

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!


http://www.ppmy.cn/news/305452.html

相关文章

疫情防控定点医院专用净水器新泩,获消费者青睐

因为疫情的影响,人们对饮食健康、环境健康等问题有了更深的认识,大家也都养成了勤洗手、注意饮食安全等良好卫生习惯。对于净水器、空气净化器、消毒柜等健康家电的需要也大大增加了。特别是净水器,“净水器哪个好”、“净水器哪种好”、“净水器买多大出水量比较好”、“净水器…

Vue 前台项目(电商)6

商品排行组件 Rank 在 Home 文件夹下创建 Rank 文件夹 并在里创建 images 文件夹和 index.vue 文件 index.vue <template><!-- 商品排行 --><div class"rank"><div class"tab"><div class"tab-tit clearfix">&…

扬帆优配|太猛了!最高暴拉170%,港股这一板块狂飙!“带货”起飞?

A股商场和港股商场上午均跌落&#xff0c;不过到上午收盘&#xff0c;A股商场上涨个股数量多于跌落个股。 港股方面&#xff0c;首要指数跌幅较大&#xff0c;但影视传媒股鹤立鸡群&#xff0c;团体大涨。其间&#xff0c;为内地观众所熟知的TVB母公司今天上午股价再度暴升&…

巽风问答5.31更新

01.柴油汽车控制的重点目标污染物是&#xff08;&#xff09; 答案&#xff1a;氮氧化物和颗粒污染物 02.白酒勾兑过程中&#xff0c;调味不包括&#xff08;&#xff09; 答案&#xff1a;定样调味 03.白酒的制作离不开酵母菌。下列说法错误的是&#xff08;&#xff09; …

清洁、对话、带娃,扫地机摆脱“人工智障”标签

​&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 来源 | 智能相对论 文 | 安知 你对家用机器人&#xff0c;还有哪些期待&#xff1f; 打扫清洁、净化空气、带娃、逗猫...... 去年科沃斯举办的一场新品发布会上&#xff0c;科沃斯机器人CEO宣布“科沃斯开启了家…

全球及中国机械设备行业运行态势与市场规模分析报告2022版

全球及中国机械设备行业运行态势与市场规模分析报告2022版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- 【修订日期】&#xff1a;2021年11月 【搜索鸿晟信合研究院查看官网更多内容&#xff01;】 第一章 机械设备行业相关概述 1.1 机械设备行业概念及分类 1.1.1 …

提示工程师指南3-Prompt工程-高级提示

高阶Prompting 到这一步&#xff0c;应该很明显&#xff0c;改进提示有助于在不同任务上获得更好的结果。这就是Prompt工程背后的整个理念。 虽然之前的例子很有趣&#xff0c;但在我们深入了解更高级的概念之前&#xff0c;让我们先正式地介绍一些概念。 文章目录 高阶Promp…

米家插件平台的技术实践之路

2016年小米正式发布米家品牌&#xff0c;此后米家开始接入第三方的智能硬件产品&#xff0c;小米的IoT生态也迎来了快速发展。截止到2020年Q3&#xff0c;小米AIoT平台已连接的IoT设备&#xff08;不包括智能手机及笔记本电脑&#xff09;数达到2.89亿台。如何高效的接入和管理…