【力扣刷题 | 第五天】

目录

前言:

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.rhkb.cn/news/59354.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣-刷题记录

189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 力扣https://leetcode.cn/problems/rotate-array/description/ void rotate(int* nums, int numsSize, int k){if(k > numsSize){k % numsSize;}if(k0){f…

出海周报|Temu在美状告shein、ChatGPT安卓版上线、小红书回应闪退

工程机械产业“出海”成绩喜人&#xff0c;山东相关企业全国最多Temu在美状告shein&#xff0c;跨境电商战事升级TikTok将在美国推出电子商务计划&#xff0c;售卖中国商品高德即将上线国际图服务&#xff0c;初期即可覆盖全球超200个国家和地区ChatGPT安卓版正式上线&#xff…

方法试用:基于强化学习提高EEG分类准确率的特征选择方法(完整代码)

2023/4/19 -4/21 脑机接口学习内容一览&#xff1a; 这一篇文章主要建立在前文脑机接口随机森林判断睡眠类型与EEG前沿方法探索的基础上&#xff0c;尝试运用强化学习的方法来提高识别睡眠阶段的准确率&#xff0c;对前段时间强化学习的学习成果做一个总结。 一、强化学习类详解…

最简单容易的四格漫画制作软件 Comic Strip Factory for Mac

Comic Strip Factory for Mac是一款漫画制作软件&#xff0c;小编亲测推荐。 Comic Strip Factory 发布了最新版本1.0.137&#xff0c;专为喜欢漫画的用户准备的。无需你会绘画就可以在Mac上制作精美的漫画&#xff0c;常见的卡通四格漫画都可以用它制作。 Comic Strip Fact…

怎么用手机制作一个四格漫画(flutter)

一&#xff0c;背景 四格漫画&#xff0c;是以四个画面分格来完成一个小故事或一个创意点子的表现形式 &#xff0c;分为开头&#xff0c;发展&#xff0c;高潮&#xff0c;结尾 。那怎么用手机制作一个四格漫画呢&#xff1f;就像下图这样。 二&#xff0c;思考过程 漫画么&…

GPT-5: 超越人类语言的模型,你还不了解一下?

目录 一、GPT-5时代引领者 二、技术特性 1&#xff0c;音频和视频处理 — 更强大的多模态处理能力 2&#xff0c;GPT-5颠覆影视制作&#xff1a;重写媒体消费时代 3&#xff0c;为机器人提供智慧大脑 4&#xff0c;更强的垂直行业应用 三、回顾一下GPT5被紧急叫停&…

【论文阅读】Computational Personality: A Survey 计算性格学综述

文章目录 摘要1. 引言2. 计算性格学研究框架2.1 性格学理论基础2.1.1 性格分类模型2.1.2 性格计算&#xff08;测量&#xff09;方法 2.2 计算性格学研究框架 3. 计算性格学研究3.1 性格预测3.1.1 基于大五模型的性格预测3.1.2 基于MBTI性格量表的性格预测3.1.3 小结 3.2 抑郁检…

安装oracle时,口令管理忘记解锁scott!

首先&#xff0c;别急&#xff0c;昨天我也是百度弄了很久才弄好&#xff0c;所以今天整理一下&#xff0c;把昨天的小小成果展示出来。 步骤&#xff1a;1.进入黑屏&#xff0c;输入sqlpus&#xff1b; 2.输入用户名&#xff1a;sys&#xff1b; 输入口令&#xff1a;sys(这个…

Primavera P6用户密码锁定及管理员忘记密码处理

经常有一些同行问到&#xff0c;下面是P6 两个相对极端的问题怎么处理 A, 管理员用户被锁定&#xff08;密码还记得&#xff09; B, 管理员忘记密码 处理这类问题一般在需要在数据库层级操作&#xff0c;当然建议信息部&#xff08;或DB&#xff09;如此操作&#xff0c;毕竟不…

oracle11g忘记管理员密码

oracle的sys和system密码是我们经常忘记的&#xff0c;忘记之后我们可以通过sqlplus来修改重置。 首先打开sqlplus&#xff1a;在运行处可直接输入打开 进入窗口后&#xff0c;首先输入 sqlplus/as sysdba 口令不要输入&#xff0c;直接回车 等数据库连接上之后执行sql语…

Oracle用户密码失效解决办法

错误信息 Oracle用户密码失效后&#xff0c;通常会报如下的错误&#xff1a; java.sql.SQLException: ORA-28001: the password has expired ORA-28001: the password has expired 查看密码有效期 这时候我们需要用sysdba登陆&#xff0c;登录后执行一下语句&#xff1a; …

Oracle System密码忘记 密码修改、删除账号锁定lock

运行cmd命令行 录入 sqlplus /nolog 无用户名登录 conn /as sysdba 连接到数据本地数据alter user system identified by password; 修改System 密码 为password或者打开sqlplus软件: 窗口用户名录入:/nolog D:\oracle\ora92\bin>sqlplus /nolog SQL*Plus: Release 9…

Oracle11g密码忘记

生活中&#xff0c;容易忘记Oracle数据库system用户的密码&#xff0c;怎么办呢&#xff0c;小生带你一步步重新登上Oracle &#xff0c;及时你密码忘记了。 1、打开cmd窗口&#xff0c;输入 sqlplus / as sysdba 2、运行cmd &#xff0c;输入 alter user 用户名 account un…

oracle忘记system密码,锁定

1.按住WindowsR&#xff0c;弹出运行框&#xff0c;输入sqlplus 2.输入sqlplus/as sysdba,回车 3.输入语句:alter user system identified by system; ---- 即可修改密码为system 4.输入语句:alter user system account unlock; ---- 即可解锁用户system

Oracle忘记密码以及账户被锁的解决办法

o(╥﹏╥)o昨天安装Oracle和PLSQL弄了一天&#xff0c;好不容易PLSQL可以连接Oracle也可以登录了&#xff0c;但是今天一直提示这个错误&#xff1a; &#xff08;这是在SQL Plus里面的错误提示&#xff0c;PLSQL里也是&#xff09; 我第一反应是密码输错了&#xff0c;然后又…

基于PHP的客户分销商管理系统

基于PHP的客户分销商管理系统 一 系统介绍 客户分销商管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;角色分为分销商和管理员&#xff0c;分销商登录可以查看个人信息和客户信息。管理员登录对客户&#xff0c;分销商及业绩进行管理。 技术栈 phpmysqlbootstrap…

通用分销渠道和通用产品组的解析

SAP为了结构化数据&#xff0c;通过销售范围&#xff08;销售组织&#xff0c;销售渠道&#xff0c;产品组&#xff09;来建立销售订单&#xff0c;销售范围是销售组织&#xff0c;销售渠道和产品组集合&#xff0c;需要大量维护销售视图。 在实际中&#xff0c;有些客户可能通…

微信三级分销系统开发说明

代码段&#xff1a; 1)贴图&#xff1a;<img src"图片地址"> 2)加入连接&#xff1a;<a href"所要连接的相关地址">写上你想写的字</a> 1)贴图&#xff1a;<img src"图片地址"> 2)加入连接&#xff1a;<a href"…

单商户商城系统功能拆解38—分销应用—分销订单

c 下面以likeshop单商户高级版 商城系统为例进行功能拆解&#xff0c;likeshop单商户高级版商城系统可以实现快速部署&#xff0c;文档齐全&#xff0c;代码全开源&#xff0c;无加密&#xff0c;极易二次开发&#xff0c;助力企业以极低的成本上线电商业务。并且likeshop以其…

代理商分销订货系统(电脑、H5、小程序、APP)多端全套源码

一、系统特色 二、系统环境 1、开发环境 系统使用VS2010SQL Server2008开发完成&#xff0c;开发技术使用.NET MVC3技术。手机端采用HBuilder X开发工具&#xff0c;技术栈为VUEuniapp。 2、安装布署 系统&#xff1a;WINDOWS2003或以上版本 数据库&#xff1a;SQL Server200…