版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37973607/article/details/89360197
56. 两数之和
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum
需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
样例
Example1:
numbers=[2, 7, 11, 15], target=9
return [0, 1]
Example2:
numbers=[15, 2, 7, 11], target=9
return [1, 2]
挑战
Either of the following solutions are acceptable:
- O(n) Space, O(nlogn) Time
- O(n) Space, O(n) Time
注意事项
你可以假设只有一组答案。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// write your code here
//暴力枚举每一个i和j,如果加起来和为target即为答案
int l=numbers.size();
int i,j;
int flag=0;//flag作为找到答案后跳出的一个标记用变量
for(i=0;i<l;++i)
{
for(j=i+1;j<l;++j)
{
if(numbers[i]+numbers[j]==target)
{
flag=1;
break;
}
}
if(flag)
break;
}
vector<int> ans;
ans.push_back(i);
ans.push_back(j);
return ans;
}
};
或:
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
// write your code her
unordered_map<int, int> hash;
vector<int> result;
// 一边循环每个数,一边加入hash表。
for (int i = 0; i < nums.size(); i++) {
if (hash.find(target - nums[i]) != hash.end()) {
// target - nums[i]的下标更小,放在前面
result.push_back(hash[target - nums[i]]);
result.push_back(i);
return result;
}
hash[nums[i]] = i;
}
// 无解的情况
result.push_back(-1);
result.push_back(-1);
return result;
}
};
57. 三数之和
给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
在三元组(a, b, c),要求a <= b <= c。
结果不能包含重复的三元组。
样例
Example 1:
Input:[2,7,11,15]
Output:[]
Example 2:
Input:[-1,0,1,2,-1,-4]
Output: [[-1, 0, 1],[-1, -1, 2]]
class Solution {
public:
vector<vector<int>> threeSum(vector<int> &nums) {
// write your code here
vector<vector<int> > result; //二维的vector
sort(nums.begin(), nums.end()); //调用C++标准库里的排序函数,需包含头文件#include<algorithm>
for(int i=0;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1])
{
continue;
}
int start=i+1,end=nums.size()-1;
int target=-nums[i];
while(start<end)
{
if(start>i+1&&nums[start]==nums[start-1])
{
start++;
continue;
}
if(nums[start]+nums[end]>target)
{
end--;
}
else if(nums[start]+nums[end]<target)
{
start++;
}
else
{
vector<int> triple;
triple.push_back(nums[i]);
triple.push_back(nums[start]);
triple.push_back(nums[end]);
result.push_back(triple);
start++;
}
}
}
return result;
}
};
扫描二维码关注公众号,回复:
5929378 查看本文章
58. 四数之和
中文English
给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。
样例
例1:
输入:[2,7,11,15],3
输出:[]
例2:
输入:[1,0,-1,0,-2,2],0
输出:
[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]
注意事项
四元组(a, b, c, d)中,需要满足a <= b <= c <= d
class Solution {
public:
vector<vector<int>> fourSum(vector<int> &nums, int target) {
// write your code here
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(i>0&&nums[i]==nums[i-1])
{
continue;
}
for(int j=i+1;j<nums.size();j++)
{
if(j>i+1&&nums[j]==nums[j-1])
{
continue;
}
int start=j+1;
int end=nums.size()-1;
while(start<end)
{
if(start>j+1&&nums[start]==nums[start-1])
{
start++;
continue;
}
if(nums[i]+nums[j]+nums[start]+nums[end]<target)
{
start++;
}
else if(nums[i]+nums[j]+nums[start]+nums[end]>target)
{
end--;
}
else
{
vector<int> triple;
triple.push_back(nums[i]);
triple.push_back(nums[j]);
triple.push_back(nums[start]);
triple.push_back(nums[end]);
result.push_back(triple);
start++;
}
}
}
}
return result;
}
};
59. 最接近的三数之和
给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
样例
例1:
输入:[2,7,11,15],3
输出:20
解释:
2+7+11=20
例2:
输入:[-1,2,1,-4],1
输出:2
解释:
-1+2+1=2
挑战
O(n^2) 时间, O(1) 额外空间。
注意事项
只需要返回三元组之和,无需返回三元组本身
class Solution {
public:
int threeSumClosest(vector<int> &nums, int target) {
// write your code here
sort(nums.begin(),nums.end());
int result=nums[0]+nums[1]+nums[2];
for(int i=0;i<nums.size();i++)
{
int start=i+1;
int end=nums.size()-1;
while(start<end)
{
if(abs(nums[i]+nums[start]+nums[end]-target)<abs(result-target))
{
result=nums[i]+nums[start]+nums[end];
}
else if(nums[i]+nums[start]+nums[end]>target)
{
end--;
}
else
{
start++;
}
}
}
return result;
}
};