python数组中的 k-diff 数对例题解析
作者:??盆友圈的小可爱???? 发布时间:2022-03-30 18:21:47
一、题目描述
题目内容:
题目示例:
题目解析:
1 <= nums.length <= 104
-107 <= nums[i] <= 107
0 <= k <= 107
二、思路分析
我们拿到本题,读取题意要求在一组整数数组中,求出差值为k的数对对数k-diff。在思考如何解答该题之前,需要明确如下几点细节:
nums数组元素都是整数
索引位置i与位置j,不能相等
k-diff数对关系:nums[i] - nums[j] = k -> nums[i] = nums[j] + k -〉 nums[i] - k = nums[j]
k-diff数对,存在相同数对情况,但结果只取1次
因此,我们的对题目中进行详细了解了,因为会排除重复的数对,我们很容易想哈希表来构建
方法一:构建哈希表
根据上述思路,我们使用python代码能快速实现,代码如下:
class Solution(object):
def findPairs(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
ans = set()
numset = set()
for num in nums:
if num - k in numset:
ans.add(num-k)
if num + k in numset:
ans.add(num)
numset.add(num)
return len(ans)
数对中重复场景如示例一中差值为k=1,(1,3) & (3,1)视为一种情况,则要定义两个哈希表来储存
哈希表可以通过字典k-value或者集合set(),本题无需考虑索引关系定义ans,numset两个集合
当 nums[i] > nums[j],则nums[j] = nums[i] - k在numset中,取最小的那一个则ans.add(nums[i]-k),
当 nuns[i] < nums[j],则nums[j] = nums[i] + k 在numset中,取较小的那一个则ans.add(nums[i])
方法二:双指针
根据上述思路,使用python代码实现,代码如下:
class Solution(object):
def findPairs(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums.sort()
ans = 0
j = 0
for i in range(len(nums)):
if i == 0 or nums[i] != nums[i-1]:
while j < len(nums) and (nums[j] < nums[i] + k or j <= i):
j +=1
if j < len(nums) and nums[j] == nums[i] + k:
ans +=1
return ans
首先对nums数组中的元素按照从低到高的顺序排列
在递增的数组中,由于双指针 i!=j,因此i指针一定是小于j的
枚举查找的判断的条件 nums[j] < nums[i]+k,指针j则往后移动
当nums[j] = nums[i] + k 时,则对数次数+1
三、总结
本题可以使用哈希方法要使用两个哈希表,属于牺牲空间换取效率。双指针方法,虽然没有用额外的空间,但是速度较于方法一慢一点。
我们用第一种方法,AC提交记录如下:
时间复杂度O(n),n为nums长度
空间复杂度O(n),需要使用哈希表,n为nums长度
来源:https://juejin.cn/post/7109863191928602637


猜你喜欢
- 资源预加载组件——preload队列,可以支持队列加载和回调,也可以加载视频或者音频进度条,可以动态获取进度条信息支持img标签的预加载,添
- python 使用get_argument获取url query参数ornado的每个请求处理程序,我们叫做handler,handler里
- 目录引入依赖配置构建实体类保存数据查询数据项目中需要存放大量设备日志,且需要对其进行简单的数据分析,信息提取工作.结合众多考量因素,项目决定
- 什么是计算属性???1、在computed中,可以定义一些属性,这些属性叫做【计算属性】2、计算属性的本质是一个方法,不过一般是将他们的名称
- 考虑以下python程序:#!/usr/bin/env pythonimport syssys.stdout.write("std
- Semantics可翻译为语义的(学),它是Html/Xhtml是否真正符合标准的重要一环。Jorux在这和大家讨论一些自己的观点,如有不妥
- Django项目中为什么会加载静态时会失败呢?原因:django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方
- Unet是一个最近比较火的网络结构。它的理论已经有很多大佬在讨论了。本文主要从实际操作的层面,讲解pytorch从头开始搭建UNet++的过
- 大家做网站,特别是自己写的代码,常常担心被一些黑客入侵服务器,从而导致网站代码被盗,给自己带来一些损失。那么我们怎么样做,就算黑客盗了你的代
- 问题描述:两个 go 程轮流打印一个切片。Golang 实现:使用两个 channel,只用来判断package mainimport (
- 本文实例为大家分享了JavaScript实现简单计算器的具体代码,供大家参考,具体内容如下此例为简单的计算器:代码示例:<!DOCTY
- 本文实例讲述了javascript自动生成包含数字与字符的随机字符串的方法。分享给大家供大家参考。具体如下:这里主要用到Math.rando
- 发现很多朋友对 CSS 的优先权不甚了解,规则很简单。需要说明的一点,如果你的样式管理需要深层判断 CSS 的优先权,更应反思自己的 CSS
- 前言go语言并没有面向对象的相关概念,go语言提到的接口和java、c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承、子类、
- 数据库设计(Database Design)的概念:数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之
- pandas读取一组数据,可能存在重复索引,虽然可以利用drop_duplicate直接删除,但是会删除重要信息。比如同一ID用户,多次登录
- 延时摄影(英语:Time-lapse photography)是以一种较低的帧率拍 下图像或者视频,然后用正常或者较快的速率播放画面的摄影技
- 在附加数据库后查看不了数据库关系图,也无法建立数据库关系图 我的解决方法如下: 1、设置兼容级别为90(2005为90)(2000为80)
- 问题:pycharm无法调用pip安装的包原因:pycharm没有设置解析器解决方法:打开pycharm->File->Sett
- 1.Cuda的下载安装及配置 首先我们要确定本机是否有独立显卡。在计算机-管理-设备管