本文主要是介绍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;}
};
这篇关于leetcode 二数之和 三数之和 四数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!