码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode刷题录之Two Sum

时间:2014-05-29 21:01:06      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

题意大概是给出一个数列num,和一个目标数target,然后要找出数列中的两个数,使得这两个数之和等于目标数,输出这两个数的下标值(从1开始算)。

  一个比较暴力的方法是用一个二重循环直接遍历序列,在第一重循环中找到a,在第二重循环中找到b,使得a+b=target,这种做法的时间复杂度是O(n^2),

提交时提示超时。

  改进方法,先对数列num复制一个副本,然后对副本进行排序。在一重循环中找到a,接着对这个有序的副本进行二分查找,找到b= target-a,二分查找的

时间复杂度是O(logn),故整个过程的时间复杂度是O(nlogn),降低了时间复杂度,提交通过。

附上C++代码:

bubuko.com,布布扣
 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 };
bubuko.com,布布扣

 

Leetcode刷题录之Two Sum,布布扣,bubuko.com

Leetcode刷题录之Two Sum

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/zhoujqia/p/3758218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!