当前位置:   article > 正文

力扣第一题(两数之和)详解_vector twosum(vector& nums, int target)

vector twosum(vector& nums, int target)

 原题如上,看到题目后第一个想法应该是最为基础的暴力求解,没什么方法可言,代码如下(c++):

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. int i,j;
  5. for( i = 0;i < nums.size();i++){
  6. for(int j = i + 1;j < nums.size();j++){
  7. if(nums[i] + nums[j] == target){
  8. return {i,j};
  9. }
  10. }
  11. }
  12. return {};
  13. }
  14. };

暴力求解虽然简单,但时间复杂度却是相当大的,因为最坏的情况下,任意两个数都要被匹配一次。

对于这种题可以转化为求解值是否在vector容器中即(target - nums[i])用此方法可以降低一定的时间复杂度,但需要一定的c++库函数unordered_map的应用知识,如果不怎么熟悉的可以仔细阅读这篇文章unordered_map详解。

 下面是详细的注解代码

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. unordered_map<int,int> hashmap;//创建unordered_map容器
  5. for(int i = 0;i < nums.size();i++){
  6. auto it = hashmap.find(target - nums[i]);//查找vector中是否有相应数
  7. if(it != hashmap.end()){ // 找到对应数值
  8. return {it -> second,i};//将找到的数的键值和对应循环时的下标i输出
  9. }
  10. hashmap[nums[i]] = i;//没有找到相应数值,将数nums[i]的数值和下标存入到哈希表中
  11. }
  12. return {};//没有满足条件的一对数,返回空
  13. }
  14. };

该算法的优点是只需要遍历一次数组(从头开始遍历,当数组没有满足的值时哈希表跳转到当前值继续遍历);时间复杂度为O(N),即为遍历数组长度所需时间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/460945
推荐阅读
相关标签
  

闽ICP备14008679号