刷题小抄1-2数之和

news2024/11/17 9:39:06

时间复杂度和空间复杂度

对于一个算法高效性的评估,分为时间复杂度与空间复杂度两种,在算法优化到极致的情况下,只能舍弃时间来换取空间,或者舍弃空间来换取时间,故而两者可以说是互斥关系

时间复杂度衡量的是算法运行的速度,而空间复杂度衡量的是算法运行所需要的额外内存空间

在计算机发展初期,计算机的存储容量很小,因此很在乎内存的消耗,也就是更看重空间复杂度,而如今时间复杂度才是决定算法优劣的主要因素

时间复杂度举例

如果存在循环,一般会对循环内使用时间最长(也是运行次数最多的语句进行时间复杂度的估算),例如以下代码中表示n*n矩阵相乘

我们找到最里面的嵌套了三层的循环语句,它被执行了n*n*n次,由于在n很大的时候(时间复杂度计算通常都默认考虑n为大数),执行该句的次数要远远大于其他语句,所以其他语句的执行时间我们都可以忽略,该算法的时间复杂度记为O(n^3)

其他常见的时间复杂度举例:

常数阶O(1):一般发生在没有循环的简单代码中

线性阶O(n):一般发生在一层循环的代码中

平方阶O(n^2): 一般发生在双层循环中

对数阶O(logn):一般发生在二分算法中

ps:

注意并不是有k层循环,时间复杂度就是O(n^k),主要还是得分析运行次数最多的语句和n之间的关系

空间复杂度举例

空间复杂度比较简单,假如对于一个有n个数的数组,你的算法使用常数个变量就能解决问题,那么你的空间复杂度为常数阶O(1),假如你需要额外使用一个同样长度为n的数组或容器来解决该问题,那么你的空间复杂度就为O(n)

两数之和

题目链接

 

 解法一: 双重循环遍历

这是最容易想到的一种解法,通过双重循环不停将两个数字组合,直到找到target,如果使用该解法我们只需要i,j两个指针辅助我们进行遍历,时间复杂度为常数故而为O(1)

对于最坏的情况下,我们在双重循环的末尾才能找到目标,也就是数组中任意两个数都要匹配一次,所以时间复杂度为O(N^2),其中N表示的是元素的数量

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n):
            for j in range(i + 1, n):
                if nums[i] + nums[j] == target:
                    return [i, j]
        
        return []

对于数组为[1,2,3,4,5]寻找target为7,其i,j搜索的方式如下:

i=1时搜索j=2,3,4,5

i=2时搜索j=3,4,5

在i=2,j=5时找到答案,返回结果,否则返回一个空数组

解法二:使用哈希表存储记录过的值

解法一中时间复杂度较高是因为对于数组[1,2,3,4,5],程序对target-x这个值没有感知,其中x是当前遍历到的数组中的值

已知target为7,当我们在搜索[1,2,3,4,5]这个数组的时候,能不能通过一次遍历,不使用双重循环,在搜索到5的时候感知到我们曾经搜索过2(target-x)数字呢,这里就需要使用额外空间了,只要使用一个容器,记录曾经遍历过的数字,然后在这个容器中寻找是否有target-x即可

初学者可能会有疑问,既然还要在容器中把target-x再找到,那岂不是又要遍历一遍,时间复杂度还是没有下降,没错,正常容器不可以,但是哈希表可以,在python中它的名字是hashtable,进入它的元素,它都能使用O(1)时间复杂度给你查找出来,这是它的强大之处,它的存储形式为(key,value)键值对,加入向hashtable中插入(key,value1)与(key,value2)那么value2的值会覆盖掉value1的值,因此hashtable还有去重的作用

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
#初始化哈希表
        hashtable = dict()
        for i, num in enumerate(nums):
#如果查找到了target-x
            if target - num in hashtable:
#返回结果
                return [hashtable[target - num], i]
#该句中将(nums[i],i)这个数对放入hashtable中
            hashtable[nums[i]] = i
        return []

时间复杂度: O(N),我们只遍历了一遍所有的元素

空间复杂度: O(N),主要是我们使用了哈希表这个额外的容器

课后作业

在两数之和的解法一中,我们使用两个索引,双重循环的方式得到了结果

对于三数之和,我们需要使用三个索引,三重循环,那么我们每次固定其中的一个索引,是否就能转换三数之和问题为两数之和呢,这样的解法是可行的,但是同样存在时间复杂度过高的问题,并且如果考虑全重复元素的极限情况,该方法是不是也不能达到排重的效果呢

假如对于三数之和使用解法二,由于hash表只能解决两数之和的问题(因为只能存储一个数对),那么每次固定最外层的索引就需要一个hash表,对于n很大的时候,空间复杂度是不可估量的,所以也不行

对于三数之和,四数之和这些衍生题型,由于有排重操作,应该使用双指针+排序

  • 排序的作用: 将相同的元素聚集在一起,通过考虑当前元素和上一个元素是否一致就能进行排重了,并且在被排序的数组中,指针向左移动,三数之和变小,指针向右移动三数之和变大,结果变得有导向性
  • 双指针的作用: 从左右两端开始向里移动,如果相遇则遍历完成,代替了双重循环,简化了时间复杂度

课后作业:三数之和,四数之和

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

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

相关文章

【Ap AutoSAR入门与实战开发03】-【Ap_s2s模块02】:到底什么是基于信号,什么是基于服务,两者的主要区别是什么?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 基于信号的通信2 基于服务的通信3 面向服务设计举例在【Ap_s2s模块01】中我们大概讲述了,为什么要有s2s模块,并且简单的阐述了基于信号的通信和基于SOME/IP的服务的通信,我们接下来详细分析一下这两个概念。…

Torch单独层赋值

20230227 - 引言 对于torch中的权值初始化方式,以往都是采用默认的方式,或者利用初始化库里面的函数。但是如果想尝试一些自己的想法,那就必须自己来填充这部分数据,例如看到的内容,利用PCA的公式来对权值进行填充。…

CSGO社区服务器搭建架设服务器配置以及环境准备

CSGO社区服务器搭建架设服务器配置以及环境准备 CSGO作为一款射击动作游戏还原场景真实性广受大批玩家的热爱,很多小伙伴也有想过自己搭建的话需要知道那些东西。 我是艾西,今天跟大家聊聊搭建架设前我们需要知道的事情: Windows&#xff1…

【谷歌grc】recaptcha browser-error 错误

grc 谷歌人机验证错误 https://www.google.com/recaptcha/api/siteverif 返回错误信息 browser-error [{"success": false,"error-codes": ["browser-error"] }]之前都是调通能用的,突然之间就不能用了,查了半天也没有找…

前端实现压缩图片的功能(vue-element)

前言: 随着现在手机像素,拍照功能越来越好,随之而来的是本地图片越来越大,那么如何更好的将本地图片上传到后端接口呢?这是后台管理系统常见的场景和头疼的问题,这里分享下个人的方法。 实现效果&#xff…

java多线程(八)线程等待与线程唤醒2

三、wait(long timeout)和notify() wait(long timeout)会让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。 下面的示例就是演示…

入职数据分析公认的好书|建议收藏

众所周知,数据分析经常出现在我们的日常生活中,各行各业都需要数据分析。可你知道什么是数据分析?它在企业里到底扮演什么角色?以及如果我们自己也想拥有数据分析的能力,以便更好的满足数据分析的需求,我们…

系列六、存储引擎

一、存储引擎介绍 大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。 比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选…

vue脚手架多页自动化生成实践

前言 在前端开发过程中,常常面对多种业务场景。到目前为止,前端对于不同场景的处理通常会采用不同的渲染方案来组合处理,常见的渲染方案包括:CSR(Client Side Rendering)、SSR(Server Side Rendering)、SSG(Static Site Generati…

2023年房地产行业研究报告

第一章 行业发展概况 房地产业是指以土地和建筑物为经营对象,从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业,是具有先导性、基础性、带动性和风险性的产业。主要包括:土地开发,房屋的…

Vue3 -- PDF展示、添加签名(带笔锋)、导出

文章目录笔锋签名方案一实现要点实现过程组件引用页面元素添加引用实现代码效果展示缺点方案二修改页面元素替换引用修改代码效果展示完整代码地址实现功能的时候采用了两个方案,主要是第一个方案最后的实现效果并不太理想,但实现起来比较简单&#xff0…

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在,表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…

【Leetcode 剑指Offer】第 5 天 查找算法(中等)

查找算法剑指 Offer 04. 二维数组中的查找剑指 Offer 11. 旋转数组的最小数字剑指 Offer 50. 第一个只出现一次的字符Python字典基础哈希表(python中是dict())有序哈希表第一个中等,后两个简单题。剑指 Offer 04. 二维数组中的查找 题&#…

Node.js的研究和应用

首先我们要知道什么是node.js? Node.js采用谷歌的V8引擎,是一个服务器端的、非阻断式I/O的、事件驱动的 JavaScript运行环境。 一、Node.js架构具体包含什么呢?咱们从一个图来看看会更加明白。 natives modules: 1.当前层内容由js实现 。…

不使用implements关键字实现实现类(类似于mapper)

首先,说明一下功能需求,平时定义一个接口,就要使用implements关键字来实现接口。那么,当不使用此关键字的时候,是否也能使相关接口也能够绑定实现类呢? 答案是肯定的。 此篇文章的主要功能有两个&#xf…

知识类问答数据集资源对外开放:百万级百度知道、社区问答及六大领域级小规模语料概述

随着chatgpt的火热,中文知识类问答数据集由收到诸多关注,其作为高质量的QA数据,可以用于SFT阶段以及pretrain预训练阶段。 本文主要介绍目前开源可下载的两个较大规模的知识类数据集,包括147万百度知道知识类数据集、425万社区问…

IOS逆向前期环境准备笔记

ios系统由于效验问题,只能升级不能降级,需要特别注意, 刷系统可以在爱思上搞定; 越狱推荐使用u盘镜像及本地启动盘制作: 注意,要进去bios,关闭安全启动,不然直接失败: Checkra1n镜…

linux升级gcc版本详细教程

0.前言一般linux操作系统默认的gcc版本都比较低,例如centos7系统默认的gcc版本为4.8.5。gcc是从4.7版本开始支持C11的,4.8版本对C11新特性的编译支持还不够完善,因此如果需要更好的体验C11以及以上版本的新特性,需要升级gcc到一个…

九、Vben之可拖拽穿梭框和水印背景如何添加

近期在开发的过程中遇到了两个难题,一个是目前的穿梭框不支持产品的要求,不能够上下拖拽,二是vben没有水印的api,需要我们自己来开发。 一、可拖拽穿梭框 做成功的效果如下: 思路: 将table放入transfer的…

操作系统权限提升(十七)之绕过UAC提权-Windows令牌概述和令牌窃取攻击

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权 操作系…