第五周:[leetcode] Two Sum、3Sum、3Sum Closest、4Sum
来源:互联网 发布:万博软件 周末 编辑:程序博客网 时间:2024/05/22 15:17
- 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] Two Sum、3Sum、3Sum Closest、4Sum
- 【leetcode X Sum 系列】Two Sum|3Sum|3Sum Closest|4Sum
- Two Sum & 3Sum & 3Sum Closest & 4Sum
- Two Sum,3Sum,3Sum Closest,4Sum
- Leetcode 1. Two Sum & 15. 3Sum & 16. 3Sum Closest & 18. 4Sum
- 【Leetcode】3Sum Closest (Sum)
- leetcode 3sum closest && 4sum
- 【LeetCode】3Sum && 3Sum Closest && 4Sum
- leetcode 3Sum 3Sum Closest 4Sum
- LeetCode OJ - 3Sum、3Sum Closest、4Sum
- LeetCode 3Sum&&3Sum Closest&&4Sum
- LeetCode:3Sum, 3Sum Closest, 4Sum
- 3Sum 3Sum Closest 4Sum
- 3Sum & 3Sum Closest & 4Sum
- 3Sum, 3Sum Closest, 4 Sum
- LeetCode: 3 Sum Closest
- leetcode - 3 sum closest
- leetcode 3Sum Closest
- ajax详解
- 聊一聊this和super关键字
- 1056. Mice and Rice (25)
- centos7中安装nginx
- CSS学习笔记(六)--CSS3
- 第五周:[leetcode] Two Sum、3Sum、3Sum Closest、4Sum
- nginx学习笔记2 nginx信号控制和平滑升级
- 卷皮2017春招笔试题
- android 报错Attempt to invoke virtual method
- C++四种强制类型转换
- No suitable driver found for jdbc:mysql://localhost:3306/shop_01
- 002--mysql索引
- 【恒大家装】成功案例
- c/c++实现顺序循环队列和链式队列