question:
Given an array of integers, find two numbers such that they add up to a specific target number.
Output: index1=1, index2=2
思路:
輸入一個無序數組和一個目標和,求出兩個數之和為這個目標數的下標,有大小之分。
目前想到三種方法:
(1)暴力枚舉法
遍歷整個數組,測試target與該數的差是否也在數組中,如果在,則這兩個數就是要找的,求出其下標即可。
時間復雜度為O(N*N),提交時提醒超時,被鄙視了。
(2)借助hashtable
C++ STL中沒有可以直接使用的hashtable模板類,可以使用其他庫實現的hashtable或者自己寫一個。
hashtable可以在O(1)時間復雜度下查找到一個元素,因此利用hashtable實現暴力枚舉法,時間復雜度會降低為O(N)
(3)雙指針
首先對數組排序,初始時一個指針指向數組第一個元素,另外一個指針指向最後一個元素,如果兩數之和大於target,右指針左移,相反,左指針右移。
排序時間復雜度為O(N*lg N),查找時間復雜度為O(N),所以整體時間復雜度為O(N*lg N)
解題:
利用方法3中的思路
class Solution { public: vectortwoSum(vector &numbers, int target) { vector tmp(numbers.size());//新建一個等大的數組 vector res;//用於保存結果 copy(numbers.begin(),numbers.end(),tmp.begin());//復制 sort(tmp.begin(),tmp.end());//排序 vector ::iterator start=tmp.begin();//左指針 vector ::iterator terminate=tmp.end()-1;//右指針 while((*start+*terminate)!=target) { if((*start+*terminate)>target) terminate--; if((*start+*terminate) ::iterator a; vector ::iterator b; if(*start!=*terminate) { a=find(numbers.begin(),numbers.end(),*start); b=find(numbers.begin(),numbers.end(),*terminate); } else { a=find(numbers.begin(),numbers.end(),*start); b=find(a+1,numbers.end(),*terminate);//第二次查找起點不一樣 } res.push_back(a-numbers.begin()+1); res.push_back(b-numbers.begin()+1); sort(res.begin(),res.end()); return res; } };