0
点赞
收藏
分享

微信扫一扫

2019-12-16-LeetCode【两数之和】,【三数之和】


两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路

暴力求解

代码

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

 

三数之和 

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

 

 

参考:​​https://leetcode-cn.com/problems/3sum/solution/3sumpai-xu-shuang-zhi-zhen-yi-dong-by-jyd/​​

参考代码

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int target;
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
if ((target = nums[i]) > 0) break;
int l = i + 1, r = nums.size() - 1;
while (l < r) {
if (nums[l] + nums[r] + target < 0) ++l;
else if (nums[l] + nums[r] + target > 0) --r;
else {
ans.push_back({target, nums[l], nums[r]});
++l, --r;
while (l < r && nums[l] == nums[l - 1]) ++l;
while (l < r && nums[r] == nums[r + 1]) --r;
}
}
}
return ans;
}
};

代码

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//思路是三指针,第一步排序,之后先固定左指针,若三指针之和>0,则左移右指针;若<0则右移中指针;若和为0,则记录下来Index,并将中指针右移和右指针左移。
vector<vector<int> >res;

//1、排序
sort(nums.begin(),nums.end());

// int i1=0;
// while(i1<nums.size())
for(int i1=0;i1<nums.size();i1++)
{
if(i1>0&&nums[i1]==nums[i1-1]) continue;
if(nums[i1]>0) break;
int i2=i1+1;
int i3=nums.size()-1;
while(i2<i3)
{
if(nums[i1]+nums[i2]+nums[i3]==0)
{
res.push_back({nums[i1],nums[i2],nums[i3]});
i3--;
while(i2<i3&&nums[i3]==nums[i3+1])
{
i3--;
}
i2++;
while(i2<i3&&nums[i2]==nums[i2-1])
{
i2++;
}
}
else if(nums[i1]+nums[i2]+nums[i3]<0)
{
i2++;
}
else
{
i3--;
}
}

}
return res;
}



// vector<vector<int>> threeSum(vector<int>& nums) {
// //思路是三指针,第一步排序,之后先固定左指针,若三指针之和>0,则左移右指针;若<0则右移中指针;若和为0,则记录下来Index,并将中指针右移和右指针左移。
// vector<vector<int> >res;

// //1、排序
// sort(nums.begin(),nums.end());
// if(nums[0]>0) return res;
// int i3=nums.size()-1;
// int i1=0;
// while(i1<nums.size()-1)
// {
// if(i1>0&&nums[i1]==nums[i1-1]) {i1++;continue;}
// int i2=i1+1;

// while(i2<i3)
// {
// if(nums[i1]+nums[i2]+nums[i3]==0)
// {
// res.push_back({nums[i1],nums[i2],nums[i3]});

// i3--;
// while(i2<i3&&nums[i3]==nums[i3+1])
// {
// i3--;
// }
// i2++;
// while(i2<i3&&nums[i2]==nums[i2-1])
// {
// i2++;
// }
// }
// else if(nums[i1]+nums[i2]+nums[i3]<0)
// {
// i2++;
// }
// else
// {
// i3--;
// }


// }
// i1++;

// }


// return res;

// }
};

注:注释掉的不知道为什么不能ac。。。

举报

相关推荐

0 条评论