力扣--数组类题目1.两数之和

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
方法一、暴力解法
时间复杂度:O(n的平方 ),空间复杂度:O(1)
该解法即对numsnumsnums进行双重遍历,将所有两个数组合情况均列举一遍,若有符合题意情况直接返回即可

from typing import List
def twoSum(nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i+1,len(nums)):if nums[i]+nums[j]==target:return [i,j]
nums=[2,7,11,15]
target = 17
a=twoSum(nums,target)
print(a)#[0, 3]

方法二、二分查找法
时间复杂度:O(nlogn),空间复杂度:O(n)
在暴力解法中,第二层遍历是对iii后面的元素进行无差别枚举,这样会导致非常多的无效枚举。
我们可以借助二分算法,来对内层循环从时间上进行优化。
因为二分算法的前提是“有序”,则我们需要先对numsnumsnums进行排序。
又因为返回答案需要原numsnumsnums顺序,所以我们不妨提前将numsnumsnums中的值与其下标做一个绑定,统一排序

import bisect
from typing import Listdef twoSum(nums: List[int], target: int) -> List[int]:n = len(nums)#print(list(zip(nums, range(n))))#[(2, 0), (11, 1), (7, 2), (15, 3)]nums = sorted(zip(nums, range(n))) # O(nlogn)print(nums)#[(2, 0), (7, 1), (11, 2), (15, 3)]# 以下部分时间复杂度为:O(nlogn)for i in range(n):t = target - nums[i][0]print("t is:",t)j = bisect.bisect_left(nums, (t, ), i + 1, n)#见如下备注print("j is:",j)if j < n and nums[j][0] == t:return [nums[i][1], nums[j][1]]#[1, 3]return []nums=[2,11,7,15]
target = 26
a=twoSum(nums,target)
print(a)
# t is: 24 备注 t为24然后在nums中查找24从i为1查到3则查到24在nums中处于第4位置所以j为4
# t is: 19 备注 t为19然后在nums中查找19从i为2查到3则查到19在nums中处于第4位置所以j为4
# t is: 15 备注 t为15然后在nums中查找15从i为3查到3则查到15在nums中处于第3位置所以j为3
# [1, 3]

方法三、双指针
时间复杂度:O(nlogn),空间复杂度:O(n)
在上面二分查找的优化中,可发现“有序”可以极大的优化内层循环的时间复杂度
发散思维,摒弃内外层循环的思路,“有序”是否还可以发挥更大的作用呢?
答案是可以的,即使用双指针算法

from typing import Listdef twoSum(nums: List[int], target: int) -> List[int]:n = len(nums)nums = sorted(zip(nums, range(n)))  # O(nlogn)#一定要排序要不然可能返回不了正确的结果print(nums)#[(2, 0), (6, 6), (7, 2), (9, 7), (11, 1), (12, 5), (15, 3), (26, 4)]# 以下部分时间复杂度为:O(n)left, right = 0, n - 1while left < right:if nums[left][0] + nums[right][0] == target:return [nums[left][1], nums[right][1]]elif nums[left][0] + nums[right][0] > target:right -= 1else:left += 1return []nums=[2,11,7,15,26,12,6,9]
target = 20
# nums=[2,5,1,4,7,3,33,20,9]
# target= 36#如果不排序则返回不了正确的结果
a=twoSum(nums,target)
print(a)
#总结:排序后为[(2, 0), (6, 6), (7, 2), (9, 7), (11, 1), (12, 5), (15, 3), (26, 4)]
#从小到大排好后首先是2+26=28,28大于20则right-1,因为最小的数加上最大的数>target,则这里最大数28舍弃
#因为28和最小的相加都大于20,和其它数相加更大于20,所以right-1
#接下来就是2+15=17,17小于target,所以要找更大的数和15相加,所以left-1

方法四,哈希表解法
时间复杂度:O(n),空间复杂度:O(n)
1.字典是一种典型的键值对类型的数据结构,每一个元素都是由一个键值对(键key和值value)组成
2.这种数据结构可以通过某个键来访问元素,所以字典也被称为映射或散列表
3.字典的主要特性是根据键快速查找值,也可以自由添加和删除元素,这有点像List,但跟List不同的是,List是连续存储,直接定址的。 字典像链表,非连续存储,所以删除元素不需要移动后续元素,就没有在内存中移动后续元素的性能开销
4.通过键来检索值的速度是非常快的,接近于 O(1),这是因为 Dictionary 类是作为一个哈希表来实现的,Dictionary 没有顺序之分,这一点不同于list列表,有顺序之分
键必须是唯一的,而值不需要唯一
5.字典中的键和值都是object类型,所以可以是任何类型(比如:string、int、自定义类型等等)

from typing import Listdef twoSum(nums: List[int], target: int) -> List[int]:n = len(nums)mp = {}for i in range(n):t = target - nums[i]print("i为%d时,字典为:%s"%(i,mp))if t in mp:return [mp[t], i]# 存放nums[i]mp[nums[i]] = i#依次把列表放入字典,key为列表中的值,value为列表中值的下标return []nums=[2,11,7,15,26,12,6,9]
target = 20
a=twoSum(nums,target)
print(a)#[1, 7]#i为7时,字典为:{2: 0, 11: 1, 7: 2, 15: 3, 26: 4, 12: 5, 6: 6}

方法五、集合视角分类讨论
时间复杂度:O(n),空间复杂度:O(n)
从集合的角度来看
我们构造两个集合:
aaa集合为nums中所有值构成的集合。
bbb集合为nums中所有值与target的距离值构成的集合(即target−nums[i])

视角一
假设答案有解,那么aaa集合与bbb集合的交集一定有值。

假设答案无解,那么有两种情况:
aaa集合与bbb集合的交集为空集
aaa集合与bbb集合的交集只有一个值,值为target的一半,并且nums中该值仅存在一个。

视角二
此外,因为题目保证一定有解,所以我们还可以再换一个视角。
从答案的构成上来看,可以分为两种情况:
第一种为nums中两个相同元素的和为target
第二种为nums中两个不同元素的和为target,比如列表[2,11,7,15] sum=30时

from typing import Listdef twoSum(nums: List[int], target: int) -> List[int]:# 分情况讨论# 情况1. nums中有两个相同的值,和为targeta = target // 2#除以2,然后向下取整print(a)if target % 2 == 0 and nums.count(a) >= 2:#count计算列表中参数x出现的次数,这里的条件是出现了2次及以上return [nums.index(a), nums.index(a, nums.index(a) + 1)]#index获得参数x在列表中的位置,index的第二个参数表示起始位置,第3个参数默认为末位置# 情况2. nums中有两个不同的值,和为target#set(nums)把列表转为集合,并且去重,集合中不能有相同的数据s = set(nums) & set([target - x for x in nums])##即{2,11,26,12,6,9}和{8, 9, 11, 14, 18, -6}取交集,返回一个集合if s != set():b = s.pop()#返回被删除的集合中一个元素return [nums.index(b), nums.index(target - b)]# 情况3. nums中没有满足题意的情况return []nums=[2,11,26,12,6,9]
target = 20
a=twoSum(nums,target)
print(a)#[5, 1]

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

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

相关文章

JavaWeb_LeadNews_Day7-ElasticSearch, Mongodb

JavaWeb_LeadNews_Day7-ElasticSearch, Mongodb elasticsearch安装配置 app文章搜索创建索引库app文章搜索思路分析具体实现 新增文章创建索引思路分析具体实现 MongoDB安装配置SpringBoot集成MongoDB app文章搜索记录保存搜索记录思路分析具体实现 查询搜索历史删除搜索历史 搜…

时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SGMD分解算法&#xff08;辛几何模态分解&#xff09;&#xff0c;分解结果可视…

再学http-为什么文件上传要转成Base64?

1 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接上传二进制文件&#xff0c;我们知道都通过网络传输最终只能传输二进制流&#xff0c;所以毫无疑问他们本…

超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用

超越界限&#xff1a;大模型应用领域扩展&#xff0c;探索文本分类、文本匹配、信息抽取和性格测试等多领域应用 随着 ChatGPT 和 GPT-4 等强大生成模型出现&#xff0c;自然语言处理任务方式正在逐步发生改变。鉴于大模型强大的任务处理能力&#xff0c;未来我们或将不再为每…

33、在SpringBoot项目添加Web组件(Servlet、Filter 和 Listener) 的三种方法

通过Spring Bean 来添加 Servlet、Filter 和 Listener ★ 添加Web组件&#xff08;Servlet、Filter、Listener&#xff09;的三种方式&#xff1a; - 使用Spring Bean添加Servlet、Filter或Listener。- 使用XxxRegistrationBean手动添加Servlet、Filter或Listener。- 使用Clas…

QT6安装完成后,再安装低版本的MinGW或其他组件方式

首先进入点击安装的uinstall Qt 并不是真的卸载 通过下面几步 1&#xff0c;首先登录自己账户 2&#xff0c;然后进入欢迎中&#xff0c;点击“添加和移除组件” 3&#xff0c;然后检索自己需要的安装内容

jpa里IdentityGenerator和IncrementGenerator的区别

IdentityGenerator 和 IncrementGenerator 的区别 IdentityGenerator 和 IncrementGenerator 都是 JPA 中可用的主键生成策略&#xff08;GenerationType&#xff09;之一。它们的区别如下&#xff1a; IdentityGenerator: IDENTITY 主键生成策略利用数据库自动生成的主键。在…

Unity实现广告滚动播放、循环播放、鼠标切换的效果

效果&#xff1a; 场景结构&#xff1a; 特殊物体&#xff1a;panel下面用排列组件horizent layout group放置多个需要显示的面板&#xff0c;用mask遮罩好。 using System.Collections; using System.Collections.Generic; using DG.Tweening; using UnityEngine; using Unity…

第4篇:vscode+platformio搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 1.配置默认安装路径&#xff0c;安装到D盘。 打开环境变量&#xff0c;点击新建 输入变量名PLATFORMIO_CORE_DIR与路径&#xff1a;D:\PLATF…

linux服务TCP参数配置

Linux TCP参数配置 阿里云规范 1.【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。 说明&#xff1a;操作系统默认 240 秒后&#xff0c;才会关闭处于 time_wait 状态的连接&#xff0c;在高并发访问下&#xff0c;服务器端会因为处于 time_wait 的连接数太多&am…

Python|Pyppeteer检测应对方法(18)

前言 本文是该专栏的第18篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 做过selenium项目的同学应该都知道,多数平台在面对selenium的突袭请求时,会被网站检测到存在webdriver或者是其他自动化工具的属性,而网站检测到这些目标属性之后,就会自动触发屏蔽机…

SpringBoot--解决空字符串转枚举异常

原文网址&#xff1a;SpringBoot--解决空字符串转枚举异常_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决Java的SpringBoot中空字符串转枚举时报错的问题。 问题复现 org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot d…

腾讯云国际站云服务器使用教程!!!

腾讯云服务器入门教程包括云服务器CPU内存带宽配置选择&#xff0c;选择云服务器CVM或轻量应用服务器&#xff0c;云服务器创建后重置密码、远程连接、搭建程序环境等&#xff0c;腾讯云服务器网分享从0到1腾讯云服务器入门教程&#xff1a; 腾讯云服务器入门教程目录&#xff…

idea切换Git分支时保存未提交的文件

解决方案 我们现在有三个分支&#xff0c;如下图&#xff1a; 我们目前在tenant分支上进行开发&#xff0c;需要去修复master的Bug&#xff0c;假设我们在tenant分支上修改了一个文件&#xff0c;如下图&#xff1a; 方法一&#xff1a;使用Shelve Changes 1、选中tenant上你不…

高性能服务器Nodejs操作Mysql数据库

目录 1 Node 操作 mysql1.2 操作 mysql 数据库 2 Web 开发模式2.1 服务端渲染2.2 前后端分离2.3 如何选择 3 身份认证3.1 Session 认证机制3.2 JWT 认证机制 1 Node 操作 mysql 数据库和身份认证 配置 mysql 模块 安装 mysql 模块 npm install mysql建立连接 const mysql …

Android相机-HAL-Rockchip-hal3

引言&#xff1a; 对于Android相机的 HAL层而言对上实现一套Framework的API接口&#xff0c;对下通过V4L2框架实现与kernel的交互。不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的&#xff1f; 代码目录&#xff1a; hardw…

python+tkinter实现多页面多菜单的demo实例

本篇文章主要讲解,python+tkinter多页面多菜单的demo实例,支持一个新窗口弹出、多页面切换,顶部菜单构建及事件绑定。 日期:2023年8月25日 版本:python3.9.6 实际效果 消息菜单-具体效果: 页面菜单具体效果: 事件菜单具体效果: 环境及依赖 python 3.9.6 依赖信息: …

rabbitMq安装后无法启动可视化页面http://localhost:15672处理

本次安装环境信息&#xff1a; 系统&#xff1a;win10 64位专业版 erlang&#xff1a;otp_win64_23.0 rabbitMQ&#xff1a;rabbitmq-server-3.8.5 安装rabbitMQ需要依赖erlang语言环境&#xff0c;所以需要我们下载erlang的环境安装程序。 一、下载安装程序 rabbitMQ安装…

java八股文面试[java基础]——接口和抽象类的区别

知识来源&#xff1a; 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili 【23版面试突击】抽象类和接口的区别&#xff0c;类可以继承多个类么&#xff0c;接口可以继承多个接口么,类可以实现多个接口么&#xff1f;_…