C++算法练习-day15——1.两数之和

题目来源:. - 力扣(LeetCode)

题目思路分析

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

思路分析

  1. 暴力解法:最直接的方法是使用两层循环遍历数组,对于每一对元素,检查它们的和是否等于目标值。这种方法的时间复杂度为 O(n^2),在数组较大时效率较低。

  2. 哈希表优化 :我们可以利用哈希表(在C++中通常使用unordered_map)来存储数组中的元素及其对应的索引。这样,在遍历数组时,我们可以直接检查 target - nums[i] 是否已经在哈希表中,如果存在,则找到了答案。这种方法的时间复杂度为 O(n),因为每个元素只被遍历一次,哈希表的查找操作平均时间复杂度为 O(1)。

代码:

复制代码
#include <vector>  
#include <unordered_map>  
  
using namespace std;  
  
class Solution {  
public:  
    vector<int> twoSum(vector<int>& nums, int target) {  
        // 创建一个哈希表来存储数组元素及其索引  
        unordered_map<int,int> hashtable;  
        int n = nums.size(); // 获取数组长度  
          
        // 遍历数组  
        for(int i = 0; i < n; ++i){  
            // 计算当前元素需要的配对值  
            int complement = target - nums[i];  
              
            // 在哈希表中查找配对值  
            auto it = hashtable.find(complement);  
              
            // 如果找到了配对值,则返回它们的索引  
            if(it != hashtable.end()){  
                return {it->second, i};  
            }  
              
            // 如果没找到,则将当前元素及其索引存入哈希表  
            hashtable[nums[i]] = i;  
        }  
          
        // 如果没有找到任何配对,返回一个空数组  
        return {};  
    }  
};

注释详解

  • unordered_map<int,int> hashtable;:创建一个哈希表,键为数组中的元素值,值为该元素在数组中的索引。
  • int n = nums.size();:获取数组的长度。
  • for(int i = 0; i < n; ++i):遍历数组。
  • int complement = target - nums[i];:计算当前元素需要的配对值,即目标值减去当前元素的值。
  • auto it = hashtable.find(complement);:在哈希表中查找配对值。
  • if(it != hashtable.end()):如果找到了配对值,说明之前已经遍历过一个元素,它的值与当前元素的配对值相等。
  • return {it->second, i};:返回之前元素的索引和当前元素的索引。
  • hashtable[nums[i]] = i;:如果没找到配对值,则将当前元素及其索引存入哈希表。
  • return {};:如果遍历完数组后没有找到任何配对,返回一个空数组。

知识点摘要

  • 哈希表(unordered_map):一种高效的键值对存储结构,支持快速的查找、插入和删除操作。
  • 时间复杂度:哈希表的查找、插入和删除操作平均时间复杂度为 O(1)。
  • 数组遍历:使用循环遍历数组的每个元素。

本文介绍了一种使用哈希表解决"两数之和"问题的高效方法。通过遍历数组并使用哈希表存储已经遍历过的元素及其索引,我们可以在 O(n) 的时间复杂度内找到和为目标值的两个整数及其索引。这种方法不仅提高了效率,而且代码简洁易懂,是处理此类问题的推荐方法。希望这篇文章能帮助你更好地理解并掌握这一算法技巧。

相关推荐
夜悊5 小时前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴6 小时前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt00120 小时前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
LDR0061 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术1 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园1 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob1 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享1 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.1 天前
C语言--day30
c语言·开发语言
玖玥拾1 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器