题意大概是给出一个数列num,和一个目标数target,然后要找出数列中的两个数,使得这两个数之和等于目标数,输出这两个数的下标值(从1开始算)。
一个比较暴力的方法是用一个二重循环直接遍历序列,在第一重循环中找到a,在第二重循环中找到b,使得a+b=target,这种做法的时间复杂度是O(n^2),
提交时提示超时。
改进方法,先对数列num复制一个副本,然后对副本进行排序。在一重循环中找到a,接着对这个有序的副本进行二分查找,找到b= target-a,二分查找的
时间复杂度是O(logn),故整个过程的时间复杂度是O(nlogn),降低了时间复杂度,提交通过。
附上C++代码:
1 class Solution { 2 public: 3 int binarySearch(vector<int> &numbers,int key,int left,int right) 4 { 5 if(left > right) { 6 return -1; 7 } 8 int mid = (left + right)/2; 9 if(numbers[mid] == key) { 10 return mid; 11 } 12 if(numbers[mid] < key) { 13 return binarySearch(numbers,key,mid+1,right); 14 } 15 if(numbers[mid] > key) { 16 return binarySearch(numbers,key,left,mid-1); 17 } 18 } 19 vector<int> twoSum(vector<int> &numbers, int target) { 20 vector<int> copy = numbers; 21 vector<int> index; 22 sort(copy.begin(),copy.end()); 23 int n1,n2; 24 for(int i = 0; i < copy.size(); i++) { 25 int key = target - copy[i]; 26 int mid = binarySearch(copy,key,0,copy.size()); 27 if( mid != -1) { 28 n1 = copy[i]; 29 n2 = copy[mid]; 30 } 31 } 32 for(int i = 0,j = 0;i < numbers.size() && j <= 2;i++) { 33 if(numbers[i] == n1) { 34 if(index.empty() || (!index.empty() && index[0] != i+1) ) { 35 index.push_back(i+1); 36 j++; 37 } 38 } 39 if(numbers[i] == n2) { 40 if(index.empty() || (!index.empty() && index[0] != i+1) ) { 41 index.push_back(i+1); 42 j++; 43 } 44 } 45 } 46 47 if(index[0] > index[1]) { 48 int temp = index[0]; 49 index[0] = index[1]; 50 index[1] = temp; 51 } 52 //cout<<index[0]<<" " <<index[1]<<endl; 53 return index; 54 } 55 56 57 };
Leetcode刷题录之Two Sum,布布扣,bubuko.com
原文:http://www.cnblogs.com/zhoujqia/p/3758218.html