【优选算法】四数之和(双指针算法)

server/2025/1/18 16:37:25/

必须有为成功付出代价的决心,然后想办法付出这个代价。

目录

1.【题目链接】 

2.【算法原理】

3.【代码】


1.【题目链接】 

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

2.【算法原理】

与前面三数之和原理很像

解法一:排序 + 暴力枚举 + 利用set去重(超时)

用四个for循环枚举出所有情况再去重。

解法二 :

  1. 排序
  2. 先固定一个数 a
  3. 剩下的范围进行 “三数之和” 算法,找到三个数使和等于 target - a(三数之和:先固定一个数 b,再利用双指针算法求剩下的数之和为 target - a - b)

注意:

  1. 去重:对 left、right、a、b 进行去重
  2. 不漏:在找到一种结果之后,left ++,right -- 继续寻找

3.【代码】

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;int n = nums.size();//1.排序sort(nums.begin(), nums.end());//2.先固定一个数a,在剩下的数里面利用三数之和等于target-afor (int i = 0; i < n; ){//先固定一个数b,在剩下的数里面利用双指针算法for (int j = i + 1; j < n; ){int left = j + 1, right = n - 1;//避免数据溢出,我们用long long类型long long count = (long long)target - nums[i] - nums[j];while (left < right){int sum = nums[left] + nums[right];if (sum > count) right--;else if (sum < count) left++;else{ret.push_back({ nums[i],nums[j],nums[left++],nums[right--] });//去重一,left和rightwhile (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.ppmy.cn/server/159395.html

相关文章

R语言的文件操作

R语言的文件操作 引言 在数据科学和分析的过程中&#xff0c;文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言&#xff0c;提供了丰富的文件操作函数&#xff0c;使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作&#xff…

2025年01月16日Github流行趋势

项目名称&#xff1a;tabby 项目地址url&#xff1a;https://github.com/TabbyML/tabby 项目语言&#xff1a;Rust 历史star数&#xff1a;27449 今日star数&#xff1a;1439 项目维护者&#xff1a;wsxiaoys, apps/autofix-ci, icycodes, liangfung, boxbeam 项目简介&#xf…

C# OpenCV机器视觉:图片去水印

阿强是个不折不扣的动漫迷&#xff0c;最近他疯狂迷上了一部超火的老动漫&#xff0c;每天茶不思饭不想&#xff0c;心心念念就盼着能多看几集。然而&#xff0c;他在网上找到的资源却像是调皮孩子脸上的脏手印&#xff0c;布满了各种乱七八糟的水印&#xff0c;这可把阿强给郁…

SpringBoot工程快速启动

1.问题导入 以后我们和前端开发人员协同开发&#xff0c;而前端开发人员需要测试前端程序就需要后端开启服务器&#xff0c;这就受制于后端开发人员。 为了摆脱这个受制&#xff0c;前端开发人员尝试着在自己电脑上安装 Tomcat 和 Idea &#xff0c;在自己电脑上启动后端程序&a…

命令模式详解与应用

在软件开发的过程中&#xff0c;我们经常会遇到需要对操作进行抽象和封装的场景。比如&#xff0c;在一个图形绘制软件中&#xff0c;用户可能执行绘制图形、撤销绘制、保存图形等操作。这些操作不仅需要被执行&#xff0c;还可能需要被记录、撤销或重做。命令模式&#xff08;…

软件测试—接口测试面试题及jmeter面试题

一&#xff0c;接口面试题 1.接口的作用 实现前后端的交互&#xff0c;实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑关系 3.接口测试必要性 1.可以发现很…

单片机静态数码管显示

在嵌入式系统学习中&#xff0c;51 单片机是经典入门选择&#xff0c;而静态数码管是常用显示设备。本文深入探讨 51 单片机与静态数码管的结合应用&#xff0c;带你从原理到代码实现&#xff0c;全方位掌握这一技术。 一、静态数码管工作原理 数码管由多个发光二极管组成&am…

【linux命令】ip命令使用

1、设置网口IP 方法1&#xff1a;通过IP设置网口ip 添加静态IP&#xff1a; ip addr add 1.1.1.1/24 dev eth0 删除ip: ip addr del 1.1.1.1/24 dev eth0 方法2&#xff1a;nmtui 配置IP另外方法&#xff1a; nmtui 2、添加路由 添加路由&#xff1a; ip route add 目标网…