- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.
您好!
老实说,我有点被这个问题难住了。 (LeetCode) 讨论论坛中针对此问题提供的解决方案并未提供太多关于如何解决该问题的解释/思考过程。我宁愿完全理解解决问题的技术,也不愿得到完整的实现代码。我觉得这将是最好的学习方式。
所以,这里的线索是使用 (Java) TreeSet 来解决这个问题。我假设 floor 和 ceiling 方法在这里很有用。
如果有人能给我一点线索/提示来解决这个问题,我将不胜感激。也欢迎使用伪代码!我不需要我之前说过的完整实现代码。只是一个起点会很棒! :)
谢谢!
编辑:我同时也在研究这个!所以,如果我最终得到答案,我会把它贴在这里以供将来引用。 :)
最佳答案
这个问题已经很老了,但是 OP 仍然没有发布他/她的答案......
我会尝试向同样偶然发现这个问题的人解释。
下面的答案是基于buckets的,时间复杂度是O(n)。
基本思路是使用宽度为k的滑动窗口。我们的注意力将被限制在这个窗口中,使得这个窗口中 i 和 j(索引)之间的差异不能大于 k。并且我们检查这个窗口中是否有两个数字相差至多为t。如果有这样的数字,那么我们就完成了。否则,我们的窗口将向前移动一步,我们将再次检查。
现在真正的问题是我们如何检查窗口中是否有两个这样的数字。当然我们可以用蛮力,那就是O(K^2),那么整个算法就是O(n * K^2)。如果 K 不大,我们可以接受。
但是,通过使用桶,我们可以做得更好!
每当我们在窗口中遇到一个数字时,我们将它除以 (t+1)。假设结果是B,我们就把这个数放到bucket[B]中。
如果t = 3,那么0,1,2,3会全部放入bucket[0],4,5,6,7会放入bucket[1],8,9,10, 11 将被放入 bucket[2] 中,依此类推。我们保证一个桶中的所有数字的差异不会大于 t。还有一件事:4 - 2 = 2 < 3 并且它们在不同的桶中。是的,一些差值小于t的数可能会被分到不同的桶中。 然而,在这种情况下,它们只能在相邻的桶中。
下面是一个例子:
nums = [1, 5, 17, 6, 8], t = 2, k = 5
(我们现在不必担心 k,因为它与 nums 的长度相同。)
因为 t = 2,所以每当我们在列表中遇到一个数字时,我们将它除以 t+1(使用整数除法)并将其放入相应的桶中。
1 / 3 = 0 --> We put 1 in bucket[0]
5 / 3 = 1 --> We put 5 in bucket[1]
由于相邻bucket[1]的buckets中可能有满足要求的元素,我们需要检查一下。 bucket[0] 的编号为 1,但是 5 - 1 > 3 并且还没有 bucket[2],所以我们继续。
17 / 3 = 5 --> We put 17 in bucket[5]
没有 bucket[4] 或 bucket[6],所以我们继续。
6 / 3 = 2 --> We put 6 in bucket[2]
我们必须检查 bucket[1] 中的数字:|5 - 6| = 1 < 2 所以有这样的数字,我们返回 True。
如果我们继续将 8 放入 bucket[2] 中,我们会发现其中已经有一个元素,即 6。由于一个桶中的所有元素的差异不大于 t,我们就完成了。
因此,为了检查是否存在两个差值小于 t 的数字,我们将遇到的每个数字都放入一个桶中。如果那个桶中已经有一个元素,那么我们就完成了。否则,我们检查相邻的桶是否有满足要求的元素,如果没有,我们继续向桶中放入数字。
我们快完成了。现在我们需要考虑窗口宽度 k。将所有k个数都放入桶中后,如果还没有找到两个这样的数,就需要将窗口向前移动一级。也就是说,删除最左边的数字及其对应的桶,并在其桶中添加一个新数字。如果它的桶已经被拿走了,那么我们就完成了。否则我们检查它的相邻桶,如果有的话。
下面是我的 Python 代码。
if t < 0 or not nums or k <= 0:
return False
buckets = {}
width = t + 1
for n, i in enumerate(nums):
buck = i // width
if buck in buckets:
return True
else:
buckets[buck] = i
if buck - 1 in buckets and i - buckets[buck-1] <= t:
return True
if buck + 1 in buckets and buckets[buck+1] - i <= t:
return True
if n >= k:
del buckets[nums[n-k] // width]
return False
关于java - (LeetCode) 包含 Duplicate III,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31119971/
题目地址:https://leetcode.com/problems/my-calendar-iii/description/ 题目描述: Implement a MyCalendarThree
题目地址:https://leetcode.com/problems/house-robber-iii/description/ 题目描述 Thethief has found himself a
题目地址:https://leetcode.com/problems/combination-sum-iii/description/ 题目描述: Find all possible combin
题目地址:https://leetcode.com/problems/path-sum-iii/#/descriptionopen in new window 题目描述 Youare given
题目地址:https://leetcode.com/problems/max-consecutive-ones-iii/ 题目描述 Given an array A of 0s and 1s, w
题目地址:https://leetcode-cn.com/problems/shortest-word-distance-iii/ 题目描述 Given a list of words and t
题目地址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ 题目描述 Sayyou ha
1.题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有
1.题目 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 输入:s = “Let’s take LeetCode contest” 输出:“s
1.题目 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的路径的数目。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径
有两个正在运行的Docker容器。一个包含Web应用程序的容器,另一个包含链接的postgres数据库。 Pgadmin III工具应安装在哪里? 最佳答案 pgAdmin can be deploy
一、题目 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数 组中连续 1 的最大个数 。 二、示例 输入:nums = [1,1,1,0,0,0,1,1,1,1
我有以下 java 代码框架 - try { Question q = null; //List of questions. I have put 3 in t
我有一个数据集,我想用它来比较物种和栖息地对家园大小的影响 - 同时使用 III 型错误和物种和栖息地内的成对比较。 这是数据的一个子集: species<- c("a","b","c","c","b
我的应用需要使用罗盘显示设备的当前方位。我正在使用的代码(下方)在我的 Galaxy Nexus 和 Galaxy One 上运行得非常好,但指南针在三星 Galaxy S III 上却疯狂地旋转。我
我的 pgAdmin 突然显示两个连接到同一个服务器(本地主机)。 我不记得今天打开软件前最后一次做了什么具体操作。 两台服务器包含相同的数据库和登录角色。 问: 为什么会这样? 只删除/删除其中一个
我在 pgAdmin 上查询时偶然发现了这种奇怪的行为。 我已连接到运行 PostgreSQL 9.1.9 的服务器。 我有一个名为 messages 的表,其定义如下: ghareh@godot:~
我最近安装了 pgAdmin III 1.18.1 并注意到一件奇怪的事情: 长json查询结果缩短为256个符号,然后添加'(...)'。 有人可以帮我禁用这个缩短吗? 最佳答案 感谢用户Erwin
leetcode 问题是: Find all possible combinations of k numbers that add up to a number n, given that only
John Carmack 在 Quake III 源代码中有一个特殊函数,它计算 float 的平方根倒数,比常规 (float)(1.0/sqrt(x)) 快 4 倍,包括奇怪的 0x5f3759d
我是一名优秀的程序员,十分优秀!