leetcode 1. Two Sum

题意

  给定一个数组和目标数字target,求出数组中的两个数,使得它们的和等于target,时间复杂度为O(n)

思路

  建立一个位图,位图int数组大小为232/32,意思就是使用这么多个int数字,构成232个位,每一个位为1代表位所对应的数字存在,比如bitmap[1] = 31 其中31=11111意思是{0 + 32,1 + 32,2 + 32,3 + 32,4 + 32} 即{32,33,34,35,36}存在。位图建立后,依次遍历每一个数字,查询位图,如果存在想要的数字,则向前遍历数字,返回结果,如果不存在,将当前位添加进位图。这里的想要的数字与当前遍历的数字之和等于target。

代码如下...

 1 class Solution {
 2 public:
 3     int* bitmap;
 4     
 5     vector<int> twoSum(vector<int>& nums, int target) {
 6         bitmap = new int[1 << 27];
 7              
 8         vector<int> v(2);
 9         
10         for(int i = 0; i < nums.size(); i++){
11             int y = target - nums[i];
12             if(get(y)){
13                 
14                 v[1] = i;
15                 for(int j = i - 1; j >= 0; j--){
16                     if(nums[j] == y){
17                         v[0] = j;
18                         
19                         return v;
20                     }
21                 }
22             }  
23             
24             put(nums[i]);
25         }
26         
27         return v;
28     }
29     
30     void put(int value){
31         unsigned int x = value;
32         
33         unsigned int y = x % 32;
34         
35         bitmap[x >> 5] = bitmap[x >> 5] | (1 << (y));
36     }
37     
38     bool get(int value){
39         unsigned int x = value;
40         
41         unsigned int y = x % 32;
42         
43         return (bitmap[x >> 5] & (1 << (y))) != 0;        
44     }
45 };
原文地址:https://www.cnblogs.com/xiaodeshan/p/7307512.html