【python】Leetcode每日一题-存在重复元素3

【题目描述】

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。

示例1:

输入:nums = [1,2,3,1], k = 3, t = 0
输出:true

示例2:

输入:nums = [1,0,1,1], k = 1, t = 2
输出:true

示例3:

输入:nums = [1,5,9,1,5,9], k = 2, t = 3
输出:false

提示:

0 <= nums.length <= 2 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^4
0 <= t <= 2^31 - 1

【分析】

  • 又学到了很多东西,有时间把前面的都归纳一下吧

  • 思路1:桶排序

    对于这题,我们可以以(t+1)长度为一个桶,num/(t+1)为桶号,则例如0、1、2、···、t为一个号为0的桶,-1、-2、···、-t、-(t-1)为一个号为-1的桶,由此利用哈希表可以记录存在元素的桶号,同时维护哈希表长度为k,则可以控制哈希表内元素为nums上连续k个元素。

    在遍历nums时,如果对于一个元素对应的桶号在哈希表内已存在,则返回True,同时还有一种情况,因为桶容量构造为(t+1),可能存在相邻桶在哈希表中,如,tt+1分别在0号和1号桶,而它们满足题设不等式关系,因此同时还需检查是否存在相邻桶以及其中元素是否满足关系,(由于需要检查其中桶号对应元素值,所有需要map数据结构。

  • 代码

class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
def getIdx(u):
return (u+1) // size - 1 if u < 0 else u // size map = {}
size = t + 1
for i,u in enumerate(nums):
idx = getIdx(u)
# 目标桶已存在(桶不为空),说明前面已有 [u - t, u + t] 范围的数字
if idx in map:
return True
# 检查相邻的桶
l, r = idx - 1, idx + 1
if l in map and abs(u - map[l]) <= t:
return True
if r in map and abs(u - map[r]) <= t:
return True
# 建立目标桶
map[idx] = u
# 维护个数为k
if i >= k:
map.pop(getIdx(nums[i-k]))
return False
  • 思路二:滑动窗口

    滑动窗口,其实就是遍历nums每个元素,每个元素检查其前k个元素,而这k个元素则很像一个窗口,遍历元素即为窗口滑动。

    而仅有滑动窗口时间复杂度为\(O(nk)\),在leetcode上会TLE,因此需要优化,比如加入对前k个元素的二分查找,或者有序化,来维护前k个元素。

    参考链接

【python】Leetcode每日一题-存在重复元素3的更多相关文章

  1. 【JavaScript】Leetcode每日一题-移除元素

    [JavaScript]Leetcode每日一题-移除元素 [题目描述] 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用 ...

  2. leetcode第217.题存在重复元素

    1.题目描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 2.示例 2.1 输入: [1,2,3,1 ...

  3. 【python】Leetcode每日一题-删除排序链表中的重复元素

    [python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...

  4. 【python】Leetcode每日一题-删除排序链表中的重复元素2

    [python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...

  5. 【python】Leetcode每日一题-删除有序数组中的重复项

    [python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...

  6. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  7. 【python】Leetcode每日一题-删除有序数组中的重复项2

    [python]Leetcode每日一题-删除有序数组中的重复项2 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不 ...

  8. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  9. 【python】Leetcode每日一题-扁平化嵌套列表迭代器

    [python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...

随机推荐

  1. 关于IO

    前言 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.IO指 ...

  2. Flutter资源

    目录 文章 一开始 HOWTO文档 网站/博客 高级 视频 组件 演示 UI 材料设计 图片 地图 图表 导航 验证 文字和富文本 分析.流量统计 自动构建 风格样式 媒体 音频 视频 语音 存储 获 ...

  3. HDFS设置配额的命令

    1 文件个数限额 #查看配额信息 hdfs dfs -count -q -h /user/root/dir1 #设置N个限额数量,只能存放N-1个文件 hdfs dfsadmin -setQuota ...

  4. 一种借助POI粗略的标注城市也许重要的区域的方法

    第一部分 很久以前,我住在村子里,因为村子小,所以对村子的一草一木都很熟悉,在熟悉的环境里就很有安全感. 后来我到了大城市,却发现城市太大了,一辈子都熟悉不完. 这个城市的绝大部分地方我都没有去过,就 ...

  5. Hexagon HDU - 6862

    题目链接:https://vjudge.net/problem/HDU-6862 题意: 由六边形组成的圆形图案,要求不重复走遍历每一个小六边形. 思路:https://www.cnblogs.com ...

  6. 归并排序(JAVA语言)

    public class merge { public static void main(String[] args) { // TODO Auto-generated method stub int ...

  7. CentOS离线安装Nginx

    在医院搭建项目环境时,因为医院通常都是内网的,访问不了外网,所以很多服务都得通过离线的方式安装,下面讲讲CentOs系统中如何离线安装Nginx. 安装准备 Nginx离线安装依赖gcc.g++环境, ...

  8. 【Django笔记2】-创建应用(app)与模型(models)

    1,创建应用(app) ​ 一个完善的网站需要许多功能提供不同的服务.如果所有的功能都在一个文件中,不利于项目多人共同开发,以及后续的维护.此时可以针对一个要实现的功能,创建一个app,将多个app结 ...

  9. SSH&SSM

    SSH和SSM的区别 SSH是Spring+Struts+Hibernate的缩写,是一种Web应用程序开源框架.框架系统分为四层:表选层.业务逻辑层.数据持久层和模块层.SSM是Spring+Spr ...

  10. Vue中的Xss构造

    首发tools:https://www.t00ls.net/thread-59512-1-1.html 存储型XSS 最近做测试的时候碰到了一个前端页面使用了Vue框架的项目 在测试XSS漏洞的过程中 ...