220. 存在重复元素 III
题目:
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
示例 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
解答:
首先这题用例挺TM蠢的,题目说了t和k为绝对值,居然还有k为负数的用例,劳资又不是ACM选手,只是想刷个算法题而已。。
1.桶排序:
照着官方题解写的。不过有几个用例过不去,如t==0的特殊情况,利用len(list)!=len(set(list))可判断,还有t<0、k<0的(sb)用例额外判断一下,以及某些极其分散的用例,如[200000000000,-2222222222222222],2,2这样的。我是判断一下llog(l)和max-min的大小关系(l是数组长度,max、min分别为数组最大最小数),若llogl小,那就直接排序解决,不然用桶排序的话要生成的桶太多了,而且几乎全部是无用的桶。
复杂度O(n)
代码:
- from math import log
- class Solution:
- def containsNearbyAlmostDuplicate(self, nums, k, t) :
- l=len(nums)
- if l< or t< or k<:
- return False
- if (t==):
- return len(nums)!=len(set(nums))
- _max=max(nums)
- _min=min(nums)
- if l*log(l)<_max-_min:
- for i in range(l):
- for j in range(max(i-k,),i):
- if abs(nums[i]-nums[j])<=t:
- return True
- return False
- hashtable=[[]for i in range((_max-_min)//t+1)]
- for i in range(l):
- x=nums[i]
- m=(x-_min)//t
- for p in hashtable[m]:
- if abs(p[]-i)<=k and abs(p[]-x)<=t:
- return True
- le,ri=m-,m+
- if le>=:
- for y in hashtable[le]:
- if abs(y[]-i)<=k and abs(y[]-x)<=t:
- return True
- if ri<len(hashtable):
- for z in hashtable[ri]:
- if abs(z[]-i)<=k and abs(z[]-x)<=t:
- return True
- hashtable[m].append((i,x))
- return False
2.二叉搜索树+滑动窗口:
由于对于两个数的索引差有绝对值<=k的限制,所以考虑维护一个长度k的窗口进行滑动。但由于窗口内的元素是无序的,如果对于每个窗口我们都进行排序,复杂度会太高。所以考虑用有序集合(C++里的set或者multi_set),窗口大小k由我们自己维护,窗口内的有序性交给set进行维护。每当我们滑动窗口时,考察右边移入窗口的新数字nums[i],因为窗口内的数字和当前索引i的索引差的绝对值一定满足<=k的要求,那么如果窗口内有相同的数字就可以返回true。如果没有,查找窗口内有无满足大小介于[nums[i]-t,nums[i]+t]范围内的数字,如果有则返回true。这里利用C++的lower_bound和upper_bound函数。
map/set.lower_bound(num),返回大于等于num的第一个迭代器
map/set.upper_bound(num),返回大于num的第一个迭代器
带模板的lower_bound格式是这样的:lower_bound<容器迭代器类型,容器元素类型>(起始迭代器,尾迭代器,元素),如:
lower_bound<vector<int>::iterator,int>(p.begin(),p.end(),);
upper_bound模板函数类似。
这个方法还是挺巧妙的,以前没有见过,记录下,滑动窗口不一定专属于线性结构。
复杂度:O(n logk)
代码:
比较坑爹的是有几个大数用例,得加long,不然AC不了。
- class Solution {
- public:
- bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
- if(t< or k<){return false;}
- set<long> st;
- for (int i = ; i < nums.size(); ++i) {
- if (st.count(nums[i])) {
- return true;
- }
- auto it = st.upper_bound(nums[i]);
- if (it != st.end() and *it - nums[i] <= t) {
- return true;
- }
- it = st.lower_bound(long(nums[i]) - t);
- if (it != st.end() and *it<nums[i]) {
- return true;
- }
- st.insert(nums[i]);
- if (st.size() == k+) {
- st.erase(nums[i-k]);
- }
- }
- return false;
- }
- };
2020-02-17 15:30:19
220. 存在重复元素 III的更多相关文章
- Java实现 LeetCode 220 存在重复元素 III(三)
220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...
- Leetcode 220.存在重复元素III
存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...
- [LeetCode]220. 存在重复元素 III
题目链接:https://leetcode-cn.com/problems/contains-duplicate-iii/ 题目描述: 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 ...
- 【每日算法】存在重复元素 III
题目描述 这是 LeetCode 上的 220. 存在重复元素 III, 难度为 [中等] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 ab ...
- [LeetCode] 220. Contains Duplicate III 包含重复元素 III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- [Swift]LeetCode220. 存在重复元素 III | Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- LeetCode220 存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...
- Leetcode 存在重复元素 (219,220)
219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. / ...
- [LeetCode] 217. Contains Duplicate 包含重复元素
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
随机推荐
- 进程无法连接到 Subscriber"XXXXXXX"
进程无法连接到 Subscriber“APP07”. 在订阅的机器上config 添加别名 APP07
- ajax-属性、原理、实现html5进度条上传文件
一.远古ajax实现方式如下: 1.前端请求后台,后台设置返回 http状态码204 2.运用img图片(或css/javascript等)的加载机制,请求后台 3.post提交数据,运用iframe ...
- mysql 零基础 开始过程
2016-11-07 算是差不多是两个月的学习,我也马上要结课了.今天才勉强把mysql装上,之前还有因为用户权限的问题,以及用户为创建的问题.应该早点就把该准备的开发平台准备好,而不是在最后快考试了 ...
- 使用SFTP连接Centos
1.centos已经配置好了SFTP,直接使用root用户连接就可以,模式选SFTP即可. 2.虽然端口号没有填写,默认端口号是22 3.可能还是会遇到无法访问的问题,可以进行iptables防火墙的 ...
- Spark学习之路 (二十七)图简介[转]
test test test test test test test test test 图 基本概念 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种数据结构. 这里的图并非 ...
- 885.求组合数 I(模板)
O(n^2) 数据范围 a*b =4e6 根据组合数公式: 代码: import java.util.Scanner; public class Main{ static final int N=2 ...
- web渗透漏洞靶场收集
最近将自己遇到过或者知道的web靶场链接奉上 0X01 DVWA 推荐新手首选靶场,配置简单,需下载phpstudy和靶场文件包,简单部署之后即可访问. 包含了常见的web漏洞(php的),每个漏洞分 ...
- hdu 1007 Quoit Design(平面最近点对)
题意:求平面最近点对之间的距离 解:首先可以想到枚举的方法,枚举i,枚举j算点i和点j之间的距离,时间复杂度O(n2). 如果采用分治的思想,如果我们知道左半边点对答案d1,和右半边点的答案d2,如何 ...
- sqlserver创建和删除外键约束
x先找出约束名字然后删除它我给个例子 --测试环境--主表create table test1(id int primary key not null,value int)insert test1 s ...
- 最新NetSarang Xmanager安装激活-XShell、XFtp
NetSarang Xmanager Enterprise 是一个简单易用的高性能的运行在 Windows 平台上的 X Server 软件.它能把远端 Unix/Linux 的桌面无缝地带到你的Wi ...