Array[1] n sum 问题
来源:互联网 发布:kiki队长网络红人主播 编辑:程序博客网 时间:2024/06/06 17:27
1. Two Sum
由于要返回index+1, 用unordered_map存elem到index的映射,注意这样的testcase:[2,3,5], 4
<span style="font-size:14px;">class Solution {public: vector<int> twoSum(vector<int> &numbers, int target) { unordered_map<int, int> num2index; for (int i=0; i<numbers.size(); ++i) num2index[numbers[i]] = i; vector<int> rs; for (int i=0; i<numbers.size(); ++i) { int left = target - numbers[i]; if (num2index.find(left) != num2index.end() && num2index[left] != i) { rs.push_back(i+1); rs.push_back(num2index[left]+1); break; } } return rs; } };</span>
要求返回最近的那个和。这个就可以先排序了,因为扫描的时间复杂度起码O(n^2)。
<span style="font-size:14px;">class Solution {public: int threeSumClosest(vector<int> &num, int target) { int mini = INT_MAX; int rs = 0; sort(num.begin(), num.end()); int n = num.size(); for(int i=0; i<n-2; ++i) { for (int j=i+1, k=n-1; j<k;) { //夹逼 int now = num[i] + num[j] + num[k]; int gap = abs(now-target); rs = gap < mini ? now : rs; //注意这句和下句的顺序 mini = gap < mini ? gap : mini; if (now > target) --k; else ++j; } } return rs; }};</span>
要求返回所有和为0的结果。和上一题相比主要困难的地方在于去重, 都必须计算第一个出现的元素,后面重复的就continue过,而不能遇到最后一个不重的才计算。注意下面这种代码的写法和直接对num去重的区别!(去重去的是num[a]和num[a-1]的那些num[a],.., 而不是去掉这种num[a] = num[b] = num[c])此外注意当sum == 0的时候,++b和--c要同时进行。
注意,这里的夹逼法和Container With Most Water的联系!!
<span style="font-size:14px;">class Solution {public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> > rs; sort(num.begin(), num.end()); int n = num.size(); for (int a=0; a<n-2; ++a) { if (a>0 && num[a-1] == num[a]) continue; for (int b=a+1, c=n-1; b<c;) { if (b > a+1 && num[b-1] == num[b]) { //去重 ++b; continue; } if (c < n-1 && num[c+1] == num[c]) { //去重 --c; continue; } int sum = num[a] + num[b] + num[c]; if (sum == 0){ vector<int> tmp({num[a], num[b], num[c]}); rs.push_back(tmp); ++b; --c; } else if (sum < 0) ++b; else --c; } } return rs; }};</span>
和上面的3sum一模一样。
<span style="font-size:14px;">class Solution {public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<vector<int>> rs; sort(num.begin(), num.end()); int n = num.size(); for(int a=0; a < n-3; a++) { if (a>0 && num[a] == num[a-1]) continue; for (int b=a+1; b < n - 2; ++b) { if (b > a+1 && num[b] == num[b-1]) continue; for (int c = b+1, d = n-1; c < d;) { if (c > b+1 && num[c] == num[c-1]) { ++c; continue; } if (d < n - 1 && num[d] == num[d+1]) { --d; continue; } int sum = num[a] + num[b] + num[c] + num[d]; if (sum == target) { vector<int> tmp({num[a], num[b], num[c], num[d]}); rs.push_back(tmp); ++c; --d; } else if(sum < target) ++c; else --d; } } } return rs; } };</span>
大家有更简洁精炼的代码,一起讨论啊!
0 0
- Array[1] n sum 问题
- leetcode 330. Patching Array 最小的添加/删除次数使sum为1到n
- leetcode之n Sum 问题
- 1,Two sum (Hashtable Array)
- 程序员面试问题1:数组问题 Programming Interview Questions 1: Array Pair Sum
- Leetcode - Array - 1. Two Sum (水题,O[n]和O[n^2]实现)
- 1-n之间的整数之和为指定数sum问题(百度之星往年试题)
- 1960. Sum of 1 to n
- hdu 1001 sum(1+...+n) 20140721.cpp
- 1+2+3+4......+n=sum
- 3-SUM问题的O(n²)算法
- HDU-1001 calculate SUM(n) = 1 + 2 + 3 + ... + n.
- LeetCode[Array]----3Sum
- LeetCode[Array]---- 4Sum
- [Array]Two Sum
- [Array]3Sum Closest
- [Array]Combination Sum
- [Array]Combination Sum II
- CSS 禁止选择(取消被选中背景)
- WTL工程设置:在X64环境中找不到atlres.h和atlapp.h
- windows下安装zookeeper
- EditText输入密码的显示与隐藏
- arcgis for js开发,根据给定的经纬度在地图上进行标注
- Array[1] n sum 问题
- [LeetCode]Populating Next Right Pointers in Each Node
- linux0.11 编译遇到的问题
- 【LeetCode】Rotate List
- 无名师的Unix心传
- 恶意 Android应用程序攻击RFID 支付卡
- R 语言 RFM 模型实现
- 签名和重载(overload) 重写(override)
- ps做出阴影