220 Contains Duplicate III

题目链接:https://leetcode.com/problems/contains-duplicate-iii/

题目:

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.

解题思路:
滑动窗口 + TreeSet
这个题自己没有想出来。。。大概能想到数据结构是 Tree,再加上滑动窗口的概念。但是没有很好地把它们整合到一起。

参考LeetCode Discuss:https://leetcode.com/discuss/38177/java-o-n-lg-k-solution TreeSet 数据结构(Java)使用红黑树实现,是平衡二叉树的一种。 该数据结构支持如下操作:
1. floor() 方法返 set 中 ≤ 给定元素的最大元素;如果不存在这样的元素,则返回 null。
2. ceiling() 方法返回 set 中 ≥ 给定元素的最小元素;如果不存在这样的元素,则返回 null。
参考链接:http://bookshadow.com/weblog/2015/06/03/leetcode-contains-duplicate-iii/

public class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if(k < 1 || t < 0)
            return false;
        TreeSet<Integer> set = new TreeSet<Integer>();
        for(int i = 0; i < nums.length; i++){
            int n = nums[i];
            if(set.floor(n) != null && n <= t + set.floor(n) || 
                    set.ceiling(n) != null && set.ceiling(n) <= t + n)
                return true;
            set.add(n);
            if (i >= k)
                set.remove(nums[i - k]);
        }
        return false;
    }
}
29 / 29 test cases passed.
Status: Accepted
Runtime: 504 ms

还有另一种解法,思路差不多,但更加巧妙的运用了 TreeSet 的方法。
SortedSet subSet(E fromElement, E toElement)
返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
参考链接:http://www.programcreek.com/2014/06/leetcode-contains-duplicate-iii-java/

import java.util.SortedSet;
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
    if (k < 1 || t < 0)
        return false;
    SortedSet<Long> set = new TreeSet<Long>(); 
    for (int j = 0; j < nums.length; j++) {
        long leftBoundary = (long) nums[j] - t;
        long rightBoundary = (long) nums[j] + t + 1;
        SortedSet<Long> subSet = set.subSet(leftBoundary, rightBoundary); 
        if (!subSet.isEmpty())
            return true; 
        set.add((long) nums[j]); 
        if (j >= k) {
            set.remove((long) nums[j - k]);
        }
    } 
    return false;
}
29 / 29 test cases passed.
Status: Accepted
Runtime: 524 ms

注意:
一开始提交代码时,显示编译错误 cannot find symbol: class SortedSet。上网找了找原因,发现是需要自己导入包,leetcode 上本身不具有。因此多加了一句 import java.util.SortedSet;

### 回答1: 这个错误提示表示您的项目构建路径中存在重复的文件或目录。通常,这会导致构建过程中出现错误或意外行为。 要解决此问题,您可以尝试执行以下步骤之一: 1. 清理项目:如果您使用的是IDE(如Eclipse或IntelliJ IDEA),则可以尝试执行“Clean”或“Rebuild”操作,以清理项目并重新生成构建路径。 2. 删除重复的文件或目录:检查您的构建路径,查找重复的文件或目录,并将其删除。 3. 检查依赖项:如果您的项目依赖于其他库或框架,则可能存在冲突或重复的依赖项。尝试检查您的依赖关系,并删除任何重复的依赖项。 希望这些提示对您有帮助! ### 回答2: "build path contains duplicate" 是一个错误提示信息,意思是构建路径中存在重复的内容。通常这个错误会发生在使用开发工具来构建项目时。 造成这个错误的原因可能有很多,比如项目中引用了重复的库文件、重复的资源文件等。解决这个问题可以采取以下步骤: 1. 检查项目的构建路径:打开项目的构建路径设置,检查是否有重复的库文件或资源文件路径。如果有,删除重复的路径。 2. 检查依赖关系:检查项目中的依赖关系,确保每个库文件只被引用一次。 3. 清理和重建项目:清除项目的构建缓存,然后重新构建项目,这样可以使得构建工具重新生成构建路径,解决重复的问题。 4. 更新工具或插件:如果使用的是开发工具或插件,可能是其版本过旧或存在Bug导致的问题。尝试更新工具或插件到最新版本,然后重建项目。 5. 检查项目配置:检查项目的配置文件,例如项目的构建脚本或配置文件,确保没有重复的内容。 总的来说,解决"build path contains duplicate"的问题需要仔细检查项目的构建路径、依赖关系和配置文件等,确保没有重复的内容存在。如果以上方法都无效,可以尝试重建项目或者咨询相关的开发工具提供商,寻求更进一步的帮助。 ### 回答3: "build path contains duplicate"是一个常见的错误消息,它在我们创建、构建或运行项目时可能会出现。这个错误消息意味着我们的构建路径中存在重复的文件或库。 通常,这种错误是由于我们在项目的构建路径里多次引用了相同的文件或库所致。这可能是因为我们在项目配置中添加了多个相同的库,或者多次导入了相同的文件。 要解决这个问题,我们需要检查项目的构建路径并找出重复的部分。首先,我们可以检查项目的构建脚本(如build.gradle或pom.xml)中是否存在多次引用相同的依赖库。如果是这种情况,我们可以删除其中一个重复的引用。 其次,我们还可以检查项目的源代码目录和资源目录,看是否有重复的文件被多次引入。如果是这种情况,我们可以手动删除重复的文件或者调整项目结构,以确保每个文件只被引用一次。 最后,我们还可以检查项目的IDE配置,并查看是否有重复的构建路径配置。有时候IDE工具可能会自动添加一些构建路径,而这些路径与我们手动添加的路径重复了。在这种情况下,我们可以删除重复的构建路径配置。 总之,当我们遇到"build path contains duplicate"错误时,我们需要仔细检查项目的构建路径,找出并删除重复的文件或库。这样,我们就可以成功构建和运行我们的项目了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值