题意
给定一个数组和目标数字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 };