• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【LeetCode每日一题】存在重复元素3

存在重复元素3

1、题目描述

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在两个下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 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

2、算法描述

算法描述:
	对于序列中每一个元素 xx 左侧的至多 kk 个元素,如果这 kk 个元素中存在一个元素落在区间 [x - t, x + t][x−t,x+t] 中,我们就找到了一对符合条件的元素。注意到对于两个相邻的元素,它们各自的左侧的 kk 个元素中有 k - 1k−1 个是重合的。于是我们可以使用滑动窗口的思路,维护一个大小为 kk 的滑动窗口,每次遍历到元素 xx 时,滑动窗口中包含元素 xx 前面的最多 kk 个元素,我们检查窗口中是否存在元素落在区间 [x - t, x + t][x−t,x+t] 中即可。

int类型相加可能会溢出,所以要转化为long类型

3、代码实现

package com.java;

import java.util.TreeSet;

public class Day17_Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        TreeSet<Long> set = new TreeSet<>();
        for (int i=0;i<n;i++) {
            Long ceiling = set.ceiling(((long)nums[i] - (long) t));
            if (ceiling != null && ceiling <= (long)nums[i] + (long)t) {
                return true;
            }
            set.add((long)nums[i]);
            if(i >=k) {
                set.remove((long) nums[i - k]);
            }
        }
        return false;
    }
}

posted on 2021-04-17 10:20  黄文超  阅读(119)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3