您的位置:首页 > 其它

第五周:[leetcode] Two Sum、3Sum、3Sum Closest、4Sum

2017-03-19 18:01 337 查看
Two Sum(E)

题目链接:链接

返回nums中两数之和为target的数的序号;

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

思路:

1. 直接使用两个for循环对nums中所有元素进行遍历搜索;

2. 运用unordered_map记录nums中的数值及位置,边保存边搜索,实现小于O(nlogn)时间效率。

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


sollution 2:
vector<int> twoSum(vector<int> &numbers, int target)
{
unordered_map<int, int> map;
vector<int> res;
for (int i = 0; i < numbers.size(); i++) {
int second = target - numbers[i];
if (map.find(second) != map.end()) {
res.push_back(map[second]);
res.push_back(i);
return res;
}
map[numbers[i]] = i;
}
return res;
}


15.3Sum(M)

题目链接:https://leetcode.com/problems/3sum/#/description

返回nums中三个数字之和为0的所有组合;

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:

[

[-1, 0, 1],

[-1, -1, 2]

]

思路:

1. 对nums进行排序O(nlogn);

2. first从第一个数开始遍历,而second和third分别从first + 1、end开始遍历;

可在遍历过程中去重提高效率。

vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
std::sort(nums.begin(), nums.end());
int l = nums.size();
for(int i=0; i< nums.size(); i++){
int target = -nums[i];
int front = i + 1;
int back = l-1;
while(front < back){
int sum = nums[front] + nums[back];
if(sum > target) back--;
else if(sum < target) front++;
else {
vector<int> v(3, 0);
v[0] = nums[i];
v[1] = nums[front];
v[2] = nums[back];
res.push_back(v);
while(front < back && v[1] == nums[front]) front++;
while(front < back && v[2] == nums[back]) back--;
}
}
while(i < l && nums[i] == nums[i+1])i++;
}
return res;
}


16.3Sum Closest(M)

题目链接:https://leetcode.com/problems/3sum-closest/#/description

返回nums中三个数之和最接近target的组合;

思路:添加保存一个最小值res,同15.3Sum(M)中相加的和进行比较,并更新res的值;

18. 4Sum

题目链接:https://leetcode.com/problems/4sum/#/description

返回nums中四个数之和等于target的值

思路:同15.3Sum(M),在此基础上加多一个循环记录second值;

vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
int l1 , l2 ;
int r = nums.size();
for(l1 = 0; l1 < r-3; l1++){
int target_3 = target - nums[l1];
for(l2 = l1  + 1;l2 < r-2; l2++){
int target_2 = target_3 - nums[l2];
int front = l2 + 1;
int back = r - 1;
while(front < back){
int sum = nums[front] + nums[back];
if(sum > target_2){
back--;
} else if(sum < target_2){
front ++;
} else {
//初始化不用new
vector<int> v(4, 0);
v[0] = nums[l1];
v[1] = nums[l2];
v[2] = nums[front];
v[3] = nums[back];
res.push_back(v);
back--;
front++;
//跳过重复数组
while(front < back && nums[back] == nums[back + 1])back--;
while(front < back && nums[front] == nums[front - 1])front++;
}

}
while(l2 < front && nums[l2+1] == nums[l2])l2++;
}
while(l1 < r-3 && nums[l1+1] == nums[l1])l1++;
}
return res;
}


总结:四个的n 个数之和的比较问题由浅入深,难度不大,注意会考虑到排序O(nlogn)、数据结构如unordered_map、去重、前后指针移动等方面即可;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode