算法系列——存在重复元素III(Contains Duplicate III)

109 阅读1分钟

题目描述

题目链接:leetcode-cn.com/problems/co…
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k.

实现思路

给定一个整数数组,判断其中是否存在两个不同的下标i和j满足:| nums[i] - nums[j] | <= t 并且 | i - j | <= k。
利用TreeSet ceiling操作或者floor操作,当

set.ceiling(nums[i]-t)<=nums[i]+t 则必然set中必然存在一个nums[j] 使得 nums[i] - nums[j] | <= t。
同时我们利用维护一个大小为 k的滑动窗口,遍历数组即可。

程序实现

public class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if(k<1||t<0)
            return false;
        TreeSet<Long> set=new TreeSet<Long>();
        for(int i=0;i<nums.length;i++){
            
            if(set.ceiling((long)nums[i]-(long)t)!=null && set.ceiling((long)nums[i]-(long)t)<=(long)nums[i]+(long)t)
                return true;
            set.add((long)nums[i]);
            //保持set中最多有k个元素
            if(i>=k)
       
                set.remove((long)nums[i-k]);
        }
        return false;
    }
}

开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系