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

优先算法 —— 双指针系列 - 四数之和

前言

本题除了多加了一个数之外,其他都与三数之和的思路相同

  

优先算法 —— 双指针系列 - 三数之和-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/hedhjd/article/details/144129358?spm=1001.2014.3001.5502


1. 四数之和

题目链接:

   

18. 四数之和 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/4sum/description/


2. 题目解析 

以示例1为例:

  

  


3. 算法原理

解法1:暴力枚举

  

排序 + 暴力枚举 + 使用set进行去重  

我们可以先进行排序,这样我们枚举之后就会发现如果有相同的那么枚举出来的值是一样的

  

但是这个解法和三数之和一样是绝对会超时的,所以我们直接跳过

解法2:双指针算法

 排序 + 双指针

我们在暴力枚举的基础上进行优化,我们进行了排序,那么数组就变成了有序的,如果是有序的数组,那么我们一般使用 二分 或者 双指针 来解决,一般能够使用双指针来解决问题就不要使用二分

  

  

处理细节问题:

  

不重复,本题有三个去重:

   

1. 使用双指针时,当我们找到一个结果的时候,left和right要进行一次去重

  

2. 当使用完双指针之后,b也要进行去重

  

3. 当使用完三数之和之后,a也要进行去重

  

  


4. 代码

class Solution
{
public:
	vector<vector<int>> fourSum(vector<int>& nums, int target)
	{
		vector<vector<int>> ret;
		// 1. 排序
		sort(nums.begin(), nums.end());
		// 2. 利⽤双指针解决问题
		int n = nums.size();
		for (int i = 0; i < n; ) // 固定数 a
		{
			// 利⽤ 三数之和
			for (int j = i + 1; j < n; ) // 固定数 b
			{
				// 双指针
				int left = j + 1, right = n - 1;
				long long aim = (long long)target - nums[i] - nums[j];
				while (left < right)
				{
					int sum = nums[left] + nums[right];
					if (sum < aim) left++;
					else if (sum > aim) right--;
					else
					{
						ret.push_back({ nums[i], nums[j], nums[left++],
						nums[right--] });
						// 去重⼀
						while (left < right && nums[left] == nums[left - 1])
							left++;
						while (left < right && nums[right] == nums[right + 1])
							right--;
					}
				}
				// 去重⼆
				j++;
				while (j < n && nums[j] == nums[j - 1]) j++;
			}
			// 去重三
			i++;
			while (i < n && nums[i] == nums[i - 1]) i++;
		}
		return ret;
	}
};

双指针系列的题目就先到此为止~


http://www.kler.cn/a/419451.html

相关文章:

  • 【Robocasa】Code Review
  • Git忽略文件
  • Android -- 简易音乐播放器
  • 通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析
  • 逆向攻防世界CTF系列42-reverse_re3
  • Redis进行性能优化可以考虑的一些策略
  • Git操作学习
  • 【技巧】Mac上如何显示键盘和鼠标操作
  • Linux centOS 7 安装 rabbitMQ
  • Advanced Macro Techniques in C/C++: `#`, `##`, and Variadic Macros
  • vmware vsphere4---搭建Starwind iSCSI存储服务器(未成功)
  • 从零开始使用GOT-OCR2.0——多模态OCR项目:微调数据集构建 + 训练(解决训练报错,成功实验微调训练)
  • 光照贴图原理
  • 数据查找文件夹里Excel、Word文件
  • 继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题
  • React 前端框架5
  • conda常用指令
  • 分布式通用计算——MapReduce(重点在shuffle 阶段)
  • 机器学习8-决策树CART原理与GBDT原理
  • 安心护送转运平台小程序
  • 使用nginx请求转发时前端报跨域问题解决
  • Vite 6.0 发布:引领现代前端开发新方向
  • el-table根据接口返回某一个字段合并行
  • lvs虚拟服务器之LVS-NAT模式
  • unity创建一传感器,当物体经过时,计数加一
  • 大数据机器学习算法与计算机视觉应用06:梯度下降