题意大概是给出一个数列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