Two Sum
来源:互联网 发布:云计算主流技术 编辑:程序博客网 时间:2024/04/29 00:27
注释的部分是普通解法o(n^2)
排序使数组是有序的,O(nlgn)的时间复杂度(注意用到了快排!)就可以解决了,此题注意小标即可!指针从俩边向中间靠拢!
#include<algorithm>struct num_type { int val; int pos; }; bool cmp(num_type a,num_type b) { return a.val < b.val; } class Solution {public: vector<int> twoSum(vector<int> &numbers, int target) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case./*vector<int> index; for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++ it){for(vector<int>::iterator second = it+1; second != numbers.end(); ++ second){if ((*it + *second) == target){index.push_back(it-numbers.begin()+1);index.push_back(second-numbers.begin()+1);}}}return index;*/ vector<int> index; vector<num_type> sort_numbers; int sum; for (vector<int>::iterator it = numbers.begin();it != numbers.end();it++) {num_type temp;temp.val = *it;temp.pos = it-numbers.begin();sort_numbers.push_back(temp); } sort(sort_numbers.begin(),sort_numbers.end(),cmp);//排序 vector<num_type>::iterator begin_pos,end_pos; begin_pos = sort_numbers.begin(); end_pos = sort_numbers.end()-1;//下标要注意! while(begin_pos != end_pos) {sum = (*begin_pos).val + (*end_pos).val;if (sum == target){if ((*begin_pos).pos < (*end_pos).pos){index.push_back((*begin_pos).pos+1);index.push_back((*end_pos).pos+1);}else{index.push_back((*end_pos).pos+1);index.push_back((*begin_pos).pos+1);}break;}else if (sum < target)//以下为首位指针向俩边靠拢!{begin_pos++;}else{end_pos--;} } return index; }};
第二次:此题在编程之美有,第一思路是用hash_map 来做(已知第一个,查第二个很快)。但是由于hash_map 是扩展的STL非标准,在vs2008 使用时需加上 using namespacce stdext; vs2008 其功能较完善,测试了下支持string,不用自己自定义!
此处用的排序,再用双端指针,向中间夹逼!
class Solution { struct data_t { int val; int pos; }; struct cmp_t { bool operator()(data_t t1,data_t t2) { return t1.val < t2.val; } }; public: vector<int> twoSum(vector<int> &numbers, int target) { if(numbers.size()<2) return vector<int>(); vector<data_t> data(numbers.size()); for(int i = 0;i < numbers.size();i++) { data[i].val = numbers[i]; data[i].pos = i+1; } sort(data.begin(),data.end(),cmp_t()); int left = 0; int right = numbers.size()-1; int sum = 0; vector<int> res(2); while(left < right) { sum = data[left].val + data[right].val; if(sum == target) { if(data[left].pos > data[right].pos ) { res[0] = data[right].pos; res[1] = data[left].pos; } else { res[0] = data[left].pos; res[1] = data[right].pos; } return res; } else if(sum < target) { left++; } else { right--; } } return vector<int>(); }};
- Two Sum
- Two Sum
- Two Sum
- two sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- Two Sum
- 实例化php类的时候如何传参
- vim语法高亮不起作用解决
- linux web服务器必需的库文件
- linux web服务器,防火墙iptables最简配置
- APMServ5.2.6 无法启动Nginx bug修复问题
- Two Sum
- 排序算法(Pascal)
- 浙工ACM1822
- c程序设计总结(一)
- 基于网页设计中div+css的认识
- insertBefore()方法 和 appendChild() 方法
- 谈谈层层递进式的中国式互联网关怀
- 你去哪儿,我也去哪儿——程序员写给媳妇儿的公开情书
- UVa 10236 The Fibonacci Primes (斐波那契素数)