算法篇--两数之和,梦开始的地方

目录

    • 1.概念:
    • 2.两数之和
      • (1).暴力破解法
      • (2).使用哈希表
    • 3.区别

1.概念:

非形式地说,算法(algorithm)就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输人转换成输出的计算步骤的一个序列。


我们也可以把算法看成是用于求解良说明的计算问题的工具。一般来说,问题陈述说明了期望的输入/输出关系。算法则描述一个特定的计算过程来实现该输入/输出关系。


例如,我们可能需要把一个数列排成非递减序。实际上,这个问题经常出现,并且为引人许多标准的设计技术和分析工具提供了足够的理由。下面是我们关于排序问题的形式定义。


输入;n个数的一个序列<al,a,··,a.>。


输出:输人序列的一个排列<a;,a!,·.·,a,>,满足a1<=a2…<=an.例如,给定输入序列《31,41,59,26,41,58),排序算法将返回序列<26,31,41,41,58.59)作为输出。这样的输人序列称为排序问题的一个实例(instance)。一般来说,问题实例由计算该问题解所必需的(满足问题陈述中强加的各种约束的)输入组成。


因为许多程序使用排序作为一个中间步,所以排序是计算机科学中的一个基本操作。因此已有许多好的排序算法供我们任意使用。对于给定应用,哪个算法最好依赖于以下因素:将被排序的项数、这些项已被稍微排序的程度、关于项值的可能限制、计算机的体系结构,以及将使用的存储设备的种类(主存、磁盘或者磁带)


2.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

例如:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
输入:nums = [3,2,4], target = 6
输出:[1,2]

(1).暴力破解法

针对这种问题我们可以使用双层for循环进行暴力破解,示例代码如下:

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
var twoSum = function(nums, target) {for (var i= 0; i < nums.length; i++){for (var j = i+1 ; j < nums.length ; j++){if (nums[i] + nums[j] === target){return [i,j]}}}return {}
};

针对这段代码我们进行大概的分析,这段代码的时间复杂度为 O(n^2), 其中 n 是数组 nums 的长度。这是因为代码使用了两个嵌套的循环来遍历数组。第一个循环的时间复杂度为 O(n),第二个循环的时间复杂度取决于当前索引 i,平均为 O(n/2)。因此,总体的时间复杂度为 O(n * n/2),即 O(n^2)。

代码的空间复杂度为 O(1),因为它只使用了常量级的额外空间来存储变量 i、j,并没有使用额外的数据结构或数组。无论输入的规模如何增长,代码所需的额外空间量是固定的。


(2).使用哈希表

/*** @param {number[]} nums* @param {number} target* @return {number[]}*/
var twoSum = function(nums, target) {const map = new Map(); // 创建哈希表存储元素及其索引for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (map.has(complement)) {return [map.get(complement), i]; // 找到两数之和等于目标值的索引}map.set(nums[i], i); // 将元素及其索引添加到哈希表}return []; // 若不存在两数之和等于目标值,返回空数组
};

这段代码使用了哈希表来降低时间复杂度,使得时间复杂度为 O(n),其中 n 是数组 nums 的长度。具体解析如下:

代码首先创建了一个空的哈希表 map,用于存储数组元素及其索引。

在遍历数组 nums 的过程中,对于每个元素 nums[i],通过计算 target - nums[i] 得到与之配对的补数 complement。

然后,检查哈希表 map 中是否存在 complement,如果存在,说明在当前索引 i 之前已经出现过补数 complement,即找到了满足条件的两个数,可以直接返回两个索引的数组

如果不存在 complement,则将当前元素 nums[i] 及其索引 i 添加到哈希表 map 中。

最终,如果没有找到满足条件的两个数,返回一个空数组。

由于只需要遍历一次数组,且哈希表的查找操作的时间复杂度为 O(1),因此总体时间复杂度为 O(n)

空间复杂度方面,额外使用了一个哈希表 map,其所需空间取决于输入数组的大小,因此空间复杂度为 O(n)。


3.区别

第一段代码使用了双重循环来遍历数组,查找满足条件的两个数。虽然代码简单,但时间复杂度为 O(n^2),在面对大规模数据时效率较低。此代码适用于数据量较小的情况。

第二段代码使用了哈希表来优化查找过程,将时间复杂度降至 O(n)。这在处理大规模数据时表现更优。它以空间复杂度为代价,利用哈希表存储元素及其索引,以更快地查找到满足条件的两个数。

因此,如果输入规模较小时,第一段代码可能更简单且适用。而在处理大规模数据时,第二段代码更有效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table组件插槽“slot-scope”

目录 一、代码展示 二、返回的数组对象不含value或者ispass&#xff0c;不会报错 三、插槽里面放的是要手动输入的值时 一、代码展示 <el-table v-loading"loading" :data"checklistList" selection-change"handleSelectionChange"><…

OV7670摄像头模块的使用

OV7670摄像头模块介绍 OV7670 CAMERACHIPTM 图像传感器&#xff0c;体积小、 工作电压低&#xff0c;提供单片 VGA 摄像头和影像处理器的所有功能。通过 SCCB 总线控制&#xff0c;可以输出整帧、子采样、取窗口等方式的各种分辨率 8 位影响数据。该产 品 VGA 图像最高达到 30…

Anaconda镜像源

Anaconda镜像源 清华镜像源阿里云镜像源中科大镜像源北大镜像源其他镜像源 清华镜像源 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ # 清华大学Anaconda镜像使用帮助 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ # Anaconda安装包下载 https://mirro…

【Linux】内存使用相关

free 命令 查看内存大小 free -g :G单位 free -h : 可读性较高较理解 free -m : MB单位 total: 总内存used: 正在运行的进程使用的内存(used total – free – buff/cache)free: 未使用的内存 (free total – used – buff/cache)shared: 多个进程共享的内存buffers: 内存保留…

面试题更新之-伪元素和伪类

文章目录 伪元素和伪类是什么&#xff1f;伪元素&#xff08;Pseudo-elements&#xff09;:伪类&#xff08;Pseudo-classes&#xff09;: css伪元素和伪类的区别使用css伪元素的好处使用css伪类的好处 伪元素和伪类是什么&#xff1f; 在CSS中&#xff0c;伪元素&#xff08;…

xpath下载安装——Python爬虫xpath插件下载安装(2023.7亲测可用!!)

目录 1.免费下载插件链接&#xff08;若失效评论区留言发送最新链接&#xff09;&#xff08;2023.7亲测可用&#xff09; 2.安装插件 &#xff08;1&#xff09;打开chrome浏览器页面&#xff0c;点击&#xff1a;右上角三个点 > 扩展程序 > 管理拓展程序 &#xff…

MongoDB(MongoTemplate和MongoRepository)对比

目录 MongoTemplateMongoRepository MongoTemplate //条件查询GetMapping("findUser")public void findUserList() {Query query new Query(Criteria.where("name").is("zhang3").and("age").is(33));List<User> users mongoT…

gitbash2.41安装教程——2023.07

文章目录 1、下载安装包2、安装 1、下载安装包 进入官网下载&#xff0c;官网链接 上面有多种系统可以选择&#xff0c;我是windows&#xff0c;点击windows进行下载 这里可以直接下载最新版本的git 2.41.0 64位。 下载可能有点慢&#xff0c;耐心等待。 2、安装 下载完…

Hive基本操作

基本概念 Hive是基于Hadoop的一个【数据仓库工具】&#xff0c;可以将结构化和半结构化的数据文件映射为一张数据库表&#xff0c;并提供简单的sql查询功能。 介绍 Hive本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS来提供数据存储&#xff0c;简单来说H…

JVM——类加载和垃圾回收

目录 前言 JVM简介 JVM内存区域划分 JVM的类加载机制 1.加载 双亲委派模型 2.验证 验证选项 3.准备 4.解析 5.初始化 触发类加载 JVM的垃圾回收策略 GC 一&#xff1a;找 谁是垃圾 1.引用计数 2.可达性分析 &#xff08;这个方案是Java采取的方案&#x…

基于单片机智能台灯坐姿矫正器视力保护器的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前当前光线强度、台灯灯光强度、当前时间、坐姿距离等&#xff1b;按键设置当前时间&#xff0c;闹钟、提醒时间、坐姿最小距离&#xff1b;通过超声波检测坐姿&#xff0c;当坐姿不正容易对眼睛和身体腰部等造成…

MySQL索引详解

索引 在MySQL中&#xff0c;查询方式可以根据访问表数据的方式分为两种&#xff1a;全表扫描和使用索引。 全表扫描&#xff08;Full Table Scan&#xff09;&#xff1a; 全表扫描是指在查询过程中&#xff0c;MySQL会遍历整个表的每一行来检查满足查询条件的数据。当查询条件…

Ubuntu下安装、配置及重装CUDA教程

安装CUDA 前往Nvidia CUDA Tools官网选择对应的架构和版本下载CUDA 以如下架构和版本为例&#xff1a; 查看显卡驱动 nvidia-smi如果显卡驱动已经装了&#xff0c;那么在CUDA安装过程中不用再勾选安装driver 下载并安装CUDA wget https://developer.download.nvidia.co…

Spring AOP

目录 AOP 理解AOP AOP组成 AOP的优点 Spring AOP 使用Spring AOP 定义切面和切点 定义通知 动态代理 织入 AOP 理解AOP AOP即面向切面编程&#xff0c;简单来说&#xff0c;就是把一部分通用的功能集中的放在一个地方处理的思想。假如某一段代码很多地方要用到&…

独立开发尝试第一周

独立开发尝试第一周 本周简单写了个前端页面&#xff0c;主要是json 在线可视化 申请了一个域名:https://jsonview.info/ 用vercel 部署了一下&#xff0c;真是神器&#xff0c;可以和github打通&#xff0c;代码提交一键部署 接入了google 分析 提交google、百度收录 短期…

创建型模式 - 建造者模式

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…

pytest 参数化进阶

目录 前言&#xff1a; 语法 参数化误区 实践 简要回顾 前言&#xff1a; pytest是一个功能强大的Python测试框架&#xff0c;它提供了参数化功能&#xff0c;可以帮助简化测试用例的编写和管理。 语法 本文就赶紧聊一聊 pytest 的参数化是怎么玩的。 pytest.mark.par…

openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句

文章目录 openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句13.1 语法格式13.2 参数说明13.3 示例 openGauss学习笔记-13 openGauss 简单数据管理-DELETE语句 DELETE语句可以从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在&#xff0c;将删除表中所有行&…

IntelliJ IDEA快捷键

编写代码 CtrlShift Enter&#xff0c;语句完成。 “&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 “&#xff01;”键。 CtrlE&#xff0c;最近的文件。 CtrlShiftE&#xff0c;最近更改的文件。 ShiftClick&#xff08;鼠标&#xff09;&#xff0c;…

css 禁止多次点击导致的选中了目标div的文字

像下面这样的情况&#xff0c;就可以用这种方法避免掉 禁止多次点击&#xff0c;导致的&#xff0c;选中了目标div的文字 或者 禁止多次点击&#xff0c;导致&#xff0c;html结构被选中显示出来 .targetDiv {-webkit-user-select: none;-moz-user-select: none;-ms-user-sel…