zoukankan      html  css  js  c++  java
  • Two Sum

    题目描述:给定一个整数数组,找到其中的两个数之和等于目标值,返回两个数的索引值index1和index2,保证index1<index2,索引值从1开始。

    例如:输入为 numbers={2, 7, 11, 15}, target=9,输出为index1=1, index2=2。

    最基本的方法是采用两个循环遍历两个数,代码如下:

     1 vector<int> twoSum(vector<int> &numbers, int target) {
     2         vector<int> result;
     3         for(int i=0;i<numbers.size()-1;i++)
     4         {
     5             for(int j=i+1;j<numbers.size();j++)
     6             {
     7                 if(numbers[i]+numbers[j]==target)
     8                 {
     9                     result.push_back(i+1);
    10                     result.push_back(j+1);
    11                     return result;
    12                 }
    13             }
    14         }
    15     }

    提交之后果断出现Time Limit Exceeded,为了降低时间复杂度,可以先将数组排序,然后采用两指针的方法:即将头指针与尾指针所指数相加,大于目标数则移动尾指针,小于目标数则移动头指针。因为要返回索引值,我们采用保存pair<int,int>类型的vector容器来存储数组值与对应的索引。代码如下:

     1 vector<int> twoSum(vector<int> &numbers, int target) {
     2         vector<int> result;
     3         vector<pair<int,int> > mid;
     4         mid.reserve(numbers.size());
     5         vector<pair<int,int> >::iterator pos;
     6         vector<pair<int,int> >::iterator end;
     7         for(int i=0;i<numbers.size();i++)
     8         {
     9             mid.push_back(pair<int,int>(i+1,numbers[i]));
    10         }     
    11         sort(mid.begin(),mid.end(),[&](const pair<int,int> &x, const pair<int,int> &y) -> bool 
    12         {  
    13            return x.second <y.second;  
    14         });
    15         for(pos=mid.begin(),end=mid.end()-1;pos!=end;)
    16         {
    17             if((pos->second+end->second)==target)
    18             {
    19                return vector<int>(  
    20             {min(pos->first, end->first),  
    21              max(pos->first, end->first)}); 
    22             }
    23             else
    24             {
    25                 if((pos->second+end->second)>target)
    26                 {
    27                     --end;
    28                 }
    29                  else
    30                  {
    31                      ++pos;
    32                  }                            
    33             }
    34         }      
    35     }

    更简单的方法,采用哈希表的方法,使用哈希表的Key来存数组值,使用Value来存索引,循环遍历数组,查找当前数组值是否在哈希表中,不在则将目标值减该值的差作为Key,循环中的i作为Value存入哈希表中,否则该值在哈希表中对应的Value+1与循环中的i+1即为结果。

    以输入为 numbers={2, 7, 11, 15}, target=9为例子进行分析,首先哈希表store中没有值,i=0时,使用store中的find方法,没找到num[0],于是store[9-2]=0;

    继续循环,当i=1时,使用store中的find方法查找到num[1],于是该store对应的Value+1与i+1即为所求的索引值。

    代码如下:

     1 vector<int> twoSum(vector<int>& nums, int target) {
     2          std::unordered_map<int,int> store;
     3         for(int i = 0; i < nums.size(); ++i)
     4         {
     5             auto itr = store.find(nums[i]);
     6             if(itr != store.end())
     7                 return std::vector<int> {itr->second+1,i+1}; 
     8             else
     9                 store[target-nums[i]] = i;
    10         }
    11     }
  • 相关阅读:
    deep_learning_Function_tensorflow_reshape()
    deep_learning_tensorflow_get_variable()
    deep_learning_Function_tensorflow_random_normal_initializer
    deep_learning_Function_numpy_newaxis参数
    deep_learning_Function_tensorflow_unpack()
    deep_learning_Function_tensorflow_transpose()
    deep_learning_LSTM长短期记忆神经网络处理Mnist数据集
    deep_learning_Function_rnn_cell.BasicLSTMCell
    嵌入式技术基础与实践-学习札记(一)
    2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组
  • 原文地址:https://www.cnblogs.com/zhulong890816/p/4625603.html
Copyright © 2011-2022 走看看