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

leetcode 二数之和 三数之和 四数之和

leetcode 二数之和 三数之和 四数之和
又到了不想写博客的环节,不想归不想,有些事情还是要做的,今天总结的是多数之和的问题。

二数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。
思考:对于这道题其实很简单,不过要想到利用哈希法来做可能有点难度,一来对哈希结构相关的语法不熟悉,而来贪图方便,就用两个for循环解决了,这里需要注意的是两个for循环的起始位置,需要遍历到所有的可能性。
法一:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {for(int i=0;i<nums.size()-1;i++){for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]==target){return {i,j};}}}return {};}
};

法二:

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> umap;for(int i=0;i<nums.size();i++){auto iter=umap.find(target-nums[i]);if(iter!=umap.end()){return {iter->second,i};}else{umap.insert(pair<int,int>(nums[i],i));}}return {};}
};

三数之和

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

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

注意:答案中不可以包含重复的三元组。
思考:这道题按照正常的思路也可以,不过剪枝和去重的时候比较麻烦,容易少写或者多写,所以最好按照双指针的写法来写

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){break;}if(i>0&&nums[i]==nums[i-1]){continue;}int left=i+1;int right=nums.size()-1;while(right>left){if(nums[i]+nums[left]+nums[right]>0) right--;else if(nums[i]+nums[left]+nums[right]<0) left++;else{result.push_back({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;}
};

四数之和

给你一个由 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) {vector<vector<int>> result;sort(nums.begin(),nums.end());for(int i=0;i<nums.size();i++){if(nums[i]>target&&nums[i]>=0){break;}if(i>0&&nums[i]==nums[i-1]){continue;}for(int j=i+1;j<nums.size();j++){if(nums[i]+nums[j]>target&&nums[i]+nums[j]>=0){break;}if(j>i+1&&nums[j]==nums[j-1]){continue;}int left=j+1;int right=nums.size()-1;while(right>left){if((long)nums[i]+nums[j]+nums[left]+nums[right]>target) right--;else if((long)nums[i]+nums[j]+nums[left]+nums[right]<target) left++;else{result.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});while(right>left&&nums[right]==nums[right-1]) right--;while(right>left&&nums[left]==nums[left+1]) left++; left++;right--;}}}}return result;}
};
http://www.lryc.cn/news/259554.html

相关文章:

  • 制衣厂生产ERP系统怎么样?制衣厂生产ERP软件哪个好
  • 安装 DevEco Studio 后不能用本地 Node.js 打开
  • AppLink+WMS,实现仓储管理一体化
  • 如果是你,你选SOHO还是跟单?
  • 大语言模型--能力
  • 安装LLaMA-Factory微调chatglm3,修改自我认知
  • 以太网协议与DNS
  • Spring Boot的日志
  • Cisco Packet Tracer配置命令——交换机篇
  • python单例模式
  • 环境保护:人类生存的最后机会
  • 头歌-Python 基础
  • C++数据结构:B树
  • 【07】ES6:对象的扩展
  • flink找不到隐式项
  • 【网络编程】-- 04 UDP
  • 【脚本】图片-音视频-压缩文件处理
  • 跨品牌的手机要怎样相互投屏?iPhone和iPad怎么相互投屏?
  • 图像特征提取-角点
  • N26:构建无缝体验的平台工程之路-Part 2
  • 【Hadoop-Distcp】通过Distcp的方式进行两个HDFS集群间的数据迁移
  • 【Linux】使用Bash和GNU Parallel并行解压缩文件
  • T天池SQL训练营(五)-窗口函数等
  • 道可云元宇宙每日资讯|上海市区块链关键技术攻关专项项目立项清单公布
  • 大语言模型有什么意义?亚马逊训练自己的大语言模型有什么用?
  • RabbitMQ-学习笔记(初识 RabbitMQ)
  • SQL Update语句
  • C语言-WIN32API介绍
  • TFIDF、BM25、编辑距离、倒排索引
  • MySQL之DML语句