提交 e27423c7 编写于 作者: L lucifer

feat: $220

上级 6edd117a
...@@ -262,8 +262,9 @@ leetcode 题解,记录自己的 leetcode 解题之路。 ...@@ -262,8 +262,9 @@ leetcode 题解,记录自己的 leetcode 解题之路。
- [0209. 长度最小的子数组](./problems/209.minimum-size-subarray-sum.md) - [0209. 长度最小的子数组](./problems/209.minimum-size-subarray-sum.md)
- [0211. 添加与搜索单词 \* 数据结构设计](./problems/211.add-and-search-word-data-structure-design.md) - [0211. 添加与搜索单词 \* 数据结构设计](./problems/211.add-and-search-word-data-structure-design.md)
- [0215. 数组中的第 K 个最大元素](./problems/215.kth-largest-element-in-an-array.md) - [0215. 数组中的第 K 个最大元素](./problems/215.kth-largest-element-in-an-array.md)
- [0220. 存在重复元素 III](./problems/220.contains-duplicate-iii.md) 🆕
- [0221. 最大正方形](./problems/221.maximal-square.md) - [0221. 最大正方形](./problems/221.maximal-square.md)
- [0227. 基本计算器 II](./problems/227.basic-calculator-ii.md)🆕 - [0227. 基本计算器 II](./problems/227.basic-calculator-ii.md) 🆕
- [0229. 求众数 II](./problems/229.majority-element-ii.md) - [0229. 求众数 II](./problems/229.majority-element-ii.md)
- [0230. 二叉搜索树中第 K 小的元素](./problems/230.kth-smallest-element-in-a-bst.md) - [0230. 二叉搜索树中第 K 小的元素](./problems/230.kth-smallest-element-in-a-bst.md)
- [0236. 二叉树的最近公共祖先](./problems/236.lowest-common-ancestor-of-a-binary-tree.md) - [0236. 二叉树的最近公共祖先](./problems/236.lowest-common-ancestor-of-a-binary-tree.md)
......
...@@ -152,6 +152,7 @@ ...@@ -152,6 +152,7 @@
- [0209. 长度最小的子数组](./problems/209.minimum-size-subarray-sum.md) - [0209. 长度最小的子数组](./problems/209.minimum-size-subarray-sum.md)
- [0211. 添加与搜索单词 \* 数据结构设计](./problems/211.add-and-search-word-data-structure-design.md) - [0211. 添加与搜索单词 \* 数据结构设计](./problems/211.add-and-search-word-data-structure-design.md)
- [0215. 数组中的第 K 个最大元素](./problems/215.kth-largest-element-in-an-array.md) - [0215. 数组中的第 K 个最大元素](./problems/215.kth-largest-element-in-an-array.md)
- [0220. 存在重复元素 III](./problems/220.contains-duplicate-iii.md) 🆕
- [0221. 最大正方形](./problems/221.maximal-square.md) - [0221. 最大正方形](./problems/221.maximal-square.md)
- [0227. 基本计算器 II](./problems/227.basic-calculator-ii.md)🆕 - [0227. 基本计算器 II](./problems/227.basic-calculator-ii.md)🆕
- [0229. 求众数 II](./problems/229.majority-element-ii.md) - [0229. 求众数 II](./problems/229.majority-element-ii.md)
......
...@@ -37,8 +37,9 @@ https://leetcode-cn.com/problems/contains-duplicate-ii/ ...@@ -37,8 +37,9 @@ https://leetcode-cn.com/problems/contains-duplicate-ii/
## 思路 ## 思路
由于题目没有对空间复杂度有求,用一个 hashmap 存储已经访问过的数字即可, 用一个 hashmap 存储已经访问过的数字,每次访问都查看 hashmap 中是否有这个元素,有的话拿出索引进行比对,是否满足条件(相隔不大于 k),如果满足返回 true 即可。
每次访问都会看 hashmap 中是否有这个元素,有的话拿出索引进行比对,是否满足条件(相隔不大于 k),如果满足返回 true 即可。
可以看出,这道题就是两数和的进阶版。大家可以将这两道题结合起来理解哦~
## 公司 ## 公司
...@@ -132,7 +133,7 @@ class Solution { ...@@ -132,7 +133,7 @@ class Solution {
- 时间复杂度:$O(N)$ - 时间复杂度:$O(N)$
- 空间复杂度:$O(N)$ - 空间复杂度:$O(N)$
更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。 更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。 关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
......
## 题目地址(220. 存在重复元素 III)
https://leetcode-cn.com/problems/contains-duplicate-iii/
## 题目描述
```
在整数数组 nums 中,是否存在两个下标 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。
如果存在则返回 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
```
## 前置知识
- 哈希表
## 公司
- 暂无
## 思路
这道题是 [219. 存在重复元素 II](https://github.com/azl397985856/leetcode/blob/master/problems/219.contains-duplicate-ii.md) 的进阶版。那道题的条件是 `nums[i] == nums[j]`, 而这道题则更加宽泛,是`nums [i] 和 nums [j] 的差的绝对值小于等于 t `
这里我们介绍一种分桶的思想,其基本思想和桶排序是类似的。
具体来说,我们可使用 t 个桶。将所有数除以 (t+1) 的结果**作为编号都存到一个哈希表中**,不难知道哈希表的大小为 t。如果两个数字的编号相同,那么意味着其绝对值差小于等于 t。
那么如果两个数字的编号不同,是否意味着其绝对值差大于 t 呢?也不一定,相邻编号也可能是绝对值差小于等于 t 。因此我们只需要检查以下三种情况即可。
1. 当前编号
2. 左边相邻的编号
3. 右边相邻的编号
另外由于题目限定是索引差小于等于 k,因此需要清除哈希表中过期的信息。
## 关键点
- 分桶排序思想的应用
## 代码
- 语言支持:Python3
Python3 Code:
```python
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
bucket = dict()
if t < 0:
return False
for i in range(len(nums)):
nth = nums[i] // (t + 1)
if nth in bucket:
return True
if nth - 1 in bucket and abs(nums[i] - bucket[nth - 1]) <= t:
return True
if nth + 1 in bucket and abs(nums[i] - bucket[nth + 1]) <= t:
return True
bucket[nth] = nums[i]
# 如果数组有相同的数会有影响么?答案是不会,因为如果有相同的数,我们直接就会在前面返回 true 了。
if i >= k:
bucket.pop(nums[i - k] // (t + 1))
return False
```
**复杂度分析**
令 n 为数组长度。
- 时间复杂度:$O(n)$
- 空间复杂度:由于过期的会被清除,因此哈希表大小不会大于 k,因此空间复杂度为 $O(min(n,k))$
> 此题解由 [力扣刷题插件](https://leetcode-pp.github.io/leetcode-cheat/?tab=solution-template) 自动生成。
力扣的小伙伴可以[关注我](https://leetcode-cn.com/u/fe-lucifer/),这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册