IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【leetcode】值和下标之差都在给定的范围内 -> 正文阅读

[数据结构与算法]【leetcode】值和下标之差都在给定的范围内

一、代码描述

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

如果存在则返回 true,不存在返回 false。

输入:nums = [1,2,3,1], k = 3, t = 0
输出:true

二、代码思路

本题可以转换为:在下标j的前K个元素中,有没有符合abs(nums[i] - nums[j]) <= t的情况

上述的公式也可以转换为(把绝对值去掉):-t <= numsi - numsj <= t
进一步转换:numsi - t <= numsj <= numsi + t。

所以,是不是有这样一种想法:把j的前k个元素放到一个数据结构中,然后我们只需要从中取出来一个大于numsi的最小元素,然后判断是否符合上述两个式子即可。

为什么我们只需要从中取出来一个大于numsi - t 的最小元素呢?

因为 t是正的,所以只有取出numsj越小,在给定的numsi的上述不等式中 numsj才能符合。

同时我们还要保证加入集合中的元素的下标是符合abs(i - j) <= k的也就是: i j 都是正的,i > k 的时候,需要把 小于 i - k的元素都删掉,i < k的时候,由于i是从i = 0,逐步递增的。

所以,就算只维护左侧的k的窗口也是可以的,因为由于绝对值的特殊性,当numi 和 numj互换也没问题,就是说num[i] - nums[j] 就算交换相减也没问题,所以并没有丢失右侧的numj。

三、代码思路

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        //本题可以转换为:在下标j的前K个元素中,有没有符合abs(nums[i] - nums[j]) <= t的情况
        //上述的公式也可以转换为(把绝对值去掉):-t <= numsi - numsj <= t 
        //进一步转换:numsi - t <= numsj <= numsi + t
        //所以,是不是有这样一种想法:把j的前k个元素放到一个数据结构中,然后我们只需要从中取出来一个大于numsi的最小元素
        //然后判断是否符合上述两个式子即可。
        //为什么我们只需要从中取出来一个大于numsi - t 的最小元素呢?
        //因为 t是正的,所以只有取出numsj越小,在给定的numsi的上述不等式中 numsj才能符合。
        //同时我们还要保证加入集合中的元素的下标是符合abs(i - j) <= k的
        //也就是: i j 都是正的,i > k 的时候,需要把 小于 i - k的元素都删掉,i < k的时候,由于i是从i = 0,逐步递增的
        //所以,就算只维护左侧的k的窗口也是可以的,因为由于绝对值的特殊性,当numi 和 numj互换也没问题。
        int n = nums.length;
        TreeSet<Long> set = new TreeSet();
        for (int i = 0; i < n; i++) {
            Long ceil = set.ceiling((long) nums[i] - (long) t);
            if (ceil != null && ceil <= (long) nums[i] + (long) t) {
                return true;
            }
            set.add((long) nums[i]);
            if (i >= k) {
                set.remove((long) nums[i - k]);
            }
        }
        return false;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:12:58  更:2022-09-30 01:15:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 18:11:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码