LeetCode 力扣 热题 100道(一)两数之和(C++)

两数之和

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

第一种方法比较常规暴力枚举,时间复杂度: O(n^2),因为我们使用双重循环遍历数组,每次检查一对元素的和。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       for (int i=0 ; i < nums.size() ; ++i) {
            for(int j=i+1 ; j<nums.size() ; ++j){
                if(nums[i]+nums[j] == target){
                    return {i,j};
                }
            }
        }
        return {};
    }
};

 第二种方法哈希表解法,时间复杂度: O(n),因为我们只遍历一次数组,对于每个元素的查找和插入操作,哈希表的时间复杂度是常数 O(1)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> num_map;
         for (int i = 0; i < nums.size(); ++i) {
            int complement = target - nums[i]; 
            if (num_map.find(complement) != num_map.end()){
                 return {num_map[complement], i};
            }
            num_map[nums[i]] = i;
         }
        return {};
    }
};

假设 nums = [2, 7, 11, 15],目标值 target = 9

  • 第一轮:

    • 当前元素是 nums[0] = 2,计算 complement = 9 - 2 = 7
    • 哈希表 num_map 为空,7 不在哈希表中。
    • 将当前元素 nums[0] = 2 存入哈希表:num_map = {2: 0}
  • 第二轮:

    • 当前元素是 nums[1] = 7,计算 complement = 9 - 7 = 2
    • 哈希表 num_map = {2: 0},发现 complement = 2 在哈希表中,说明 nums[0] + nums[1] = 9
    • 返回结果:{0, 1}

如何用哈希表来找到两个数?

  1. 问题的核心思想: 对于每一个元素 nums[i],我们希望在之前遍历的数组元素中,找到一个数 complement,使得 nums[i] + complement = target,从而满足题目条件。也就是:

    complement=target−nums[i]\text{complement} = \text{target} - \text{nums}[i]complement=target−nums[i]

    这样,我们就可以通过查找哈希表中是否存在 complement 来判断是否找到了匹配的两个数。

  2. 为什么哈希表有效?

    • 哈希表是一个常数时间查找结构: 使用哈希表存储之前遍历过的元素,每个元素和其下标都作为键值对存储。查找一个元素是否在哈希表中存在的时间复杂度为 O(1)
    • 早期发现匹配: 在遍历数组时,我们可以在当前元素 nums[i] 被处理之前,检查 target - nums[i] 是否已经出现在哈希表中。这样,查找操作变得非常高效,我们能快速确定某个值是否已经出现在数组的前面部分。
  3. 解释为什么能找到配对:

    • 思考过程: 对于每一个元素 nums[i],我们在遍历过程中都计算出当前元素和目标值的差值 complement = target - nums[i]。然后我们查找哈希表中是否存在 complement,如果存在,就说明存在两个数,它们的和为 target
    • 哈希表的作用: 哈希表的作用是记录我们已经遍历过的元素,所以当我们遇到某个元素时,我们只需要查找它的差值是否已经存在。这样就可以快速找到一对数。
  4. 为什么可以在 O(n) 时间内找到答案:

    • 一遍扫描: 在遍历数组时,我们只需要对每个元素进行一次查找和插入操作,且每次查找和插入的时间复杂度是常数 O(1)
    • 不需要重复扫描: 不像暴力解法需要两层循环去遍历数组的每一对元素,哈希表方法只需要遍历一次数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis经典面试题-深度剖析

redis是单线程架构还是多线程架构 Redis 的核心操作是单线程架构&#xff0c;但在某些场景中也会使用多线程。 Redis 的大部分操作&#xff08;如键值存储、查询、更新等&#xff09;是通过单线程完成的&#xff0c;即所有客户端的请求在 Redis 中按顺序执行。这种设计主要出…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

基于LlamaIndex的应用开发中可选择的向量数据库分析

&#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[15045666310163.com] &#…

软考知识备忘

数据库设计 分布透明性指用户不必关心教据的逻辑分片&#xff0c;不必关心数据存储的物理位置分配细节&#xff0c;也不必关心局部场地上数据库的数据模型。 分片透明性是分布透明性的最高层次。 位置透明性指用户或应用程序应当了解分片情况&#xff0c;但不必了解片段的存储…

【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法

问题现象 因为人为因素导致部分统计信息函数未安装&#xff0c;自动统计信息触发执行长期失败。重新安装统计信息相关函数后&#xff0c;发现仍然无法正常自动统计信息收集&#xff0c;统计信息状态为 broken。 问题原因 统计信息 JOB 收集失败次数达到 16 次会直接禁用 JOB …

如何选择适合的AWS EC2实例类型

在云计算的世界中&#xff0c;Amazon Web Services&#xff08;AWS&#xff09;提供了丰富的服务&#xff0c;其中Elastic Compute Cloud&#xff08;EC2&#xff09;是最受欢迎的服务之一。选择合适的EC2实例类型对于确保应用程序的性能和成本效益至关重要。我们九河云通过本文…

Ubuntu 的 ROS2 操作系统turtlebot3环境搭建

引言 本文介绍如何在 Ubuntu 系统上为 TurtleBot3 配置 ROS2 环境&#xff0c;提供详细的操作步骤以便在 PC 端控制 TurtleBot3。 本文适用于 ROS2 Humble 的安装与配置&#xff0c;涵盖必要的依赖包和 Gazebo 仿真环境的设置&#xff0c;帮助用户避免在环境搭建过程中遇到的兼…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

HCIP-快速生成树RSTP

一、RSTP是什么 STP&#xff08;Spanning Tree Protocol &#xff09;是生成树协议的英文缩写。该协议可应用于环路网络&#xff0c;通过一定的算法实现路径冗余&#xff0c;同时将环路网络修剪成无环路的树型网络&#xff0c;从而避免报文在环路网络中的增生和无限循环。 RS…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求&#xff0c;需要自行搭建SMB服务&#xff0c;**SMB&#xff08;Server Message Block&#xff09;**协议是一种常用的文件共享方式&#xff0c;它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

Elasticsearch中什么是倒排索引?

倒排索引&#xff08;Inverted Index&#xff09;是一种索引数据结构&#xff0c;它在信息检索系统中被广泛使用&#xff0c;特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容&#xff08;如文本&#xff09;与其存储位置之间的映射&…

部署DNS域名解析服务

部署DNS域名解析服务 一.DNS介绍 域名 Domain Name&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的名字组成的 Intermet 上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时标识计算机的电子方位。具有独一无二&#xff0c;不可重复的特性。 DNS 域名…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

ubuntu18.04 安装与卸载NCCL conda环境安装PaddlePaddle

cuda版本11.2 说明PaddlePaddle需要安装NCCL 1、Log in | NVIDIA Developer 登录官网 找到对应版本 官方提供了多种安装方式&#xff0c;本文使用Local installers (x86)本地安装 点击对应的版本下载如&#xff1a; nccl-local-repo-ubuntu1804-2.8.4-cuda11.2_1.0-1_amd6…

FPGA实现以太网(二)、初始化和配置PHY芯片

系列文章目录 FPGA实现以太网&#xff08;一&#xff09;、以太网基础知识 文章目录 系列文章目录一、MDIO协议介绍二、PHY芯片管脚以及结构框图三、MDIO帧时序介绍3.1 MDIO帧格式3.2 MDIO写时序3.3 MDIO读时序 四、PHY芯片常用寄存器描述4.1 基本模式控制寄存器&#xff08;0…

leetcode day10 动态规划篇 64+139

64 最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 m grid.lengthn grid[i].length1 < m, n < 2000 < grid[i][j]…

【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法

目录 一、相关问题 1. 什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; &#xff08;1&#xff09;内存扩展 &#xff08;2&#xff09;内存隔离 &#xff08;3&#xff09;物理内存管理 &#xff08;4&#xff09;页面交换 &#xff08;5&#xff09;内存映…

【论文复现】ChatGPT多模态命名实体识别

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ChatGPT ChatGPT辅助细化知识增强&#xff01;1. 研究背景2. 模型结构和代码3. 任务流程第一阶段&#xff1a;辅助精炼知识启发式生成第二阶段…

深度学习之循环神经网络(RNN)

1 为什么需要RNN&#xff1f; ​ 时间序列数据是指在不同时间点上收集到的数据&#xff0c;这类数据反映了某一事物、现象等随时间的变化状态或程度。一般的神经网络&#xff0c;在训练数据足够、算法模型优越的情况下&#xff0c;给定特定的x&#xff0c;就能得到期望y。其一…

【从零开始的LeetCode-算法】3238. 求出胜利玩家的数目

给你一个整数 n &#xff0c;表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick &#xff0c;其中 pick[i] [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。 如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个&#xff0c;那么我们说玩家 i 是胜利玩家。…