第五周:[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)时间效率。
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开始遍历;
可在遍历过程中去重提高效率。
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值;
总结:四个的n 个数之和的比较问题由浅入深,难度不大,注意会考虑到排序O(nlogn)、数据结构如unordered_map、去重、前后指针移动等方面即可;
题目链接:链接
返回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、去重、前后指针移动等方面即可;
相关文章推荐
- 程序员面试题目总结--数组(27)【Two Sum 、3Sum、3Sum Closest 、4Sum】
- Two Sum,3Sum,3Sum Closest,4Sum
- LeetCode:3Sum, 3Sum Closest, 4Sum
- LeetCode:3Sum, 3Sum Closest, 4Sum
- leetcode 3Sum 3Sum Closest 4Sum
- LeetCode Two Sum、3Sum、3Sum Closest、4Sum
- [LeetCode] Two Sum, 3Sum ,3SumCloset , 4Sum
- [LeetCode] K sum(2Sum、3Sum、4Sum)
- LeetCode OJ - 3Sum、3Sum Closest、4Sum
- LeetCode#15* 3Sum && LeetCode#16 3Sum Closest && LeetCode#18 4Sum
- LeetCode 3Sum&&3Sum Closest&&4Sum
- LeetCode之“散列表”:Two Sum && 3Sum && 3Sum Closest && 4Sum
- leetcode--sum集合:2sum,3sum,4sum
- 2016/10/28 很久没更了 leetcode解题 3sum问题进阶版4sum
- [Leetcode][求和问题2Sum/3Sum/4Sum/KSum]相关题目汇总/分析/总结
- leetcode 15. 3sum && 16. 3Sum Closest && 18. 4Sum
- [Leetcode] #1#15#18 2Sum & 3Sum & 4Sum
- leetcode题解-15. 3Sum && 16. 3Sum Closest
- 【LeetCode】3Sum,3Sum Closest 题解报告
- 【leetcode】3Sum, 3Sum Closest