• 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 };
  • 相关阅读:
    道路和航线
    Sorting It All Out
    Sightseeing Cows(0/1分数规划+Spfa判负环)
    【模板】缩点
    间谍网络
    Tarjan算法专练
    数论知识点总结
    博客迁移到博客园
    第一届CCPC河南省赛
    find程序实现
  • 原文地址:https://www.cnblogs.com/xiaodeshan/p/7307512.html
Copyright © 2020-2023  润新知