当前位置: 首页 > news >正文

建站素材网管理系统网页界面设计

建站素材网,管理系统网页界面设计,wordpress最好的编辑器下载地址,做网站的一些话术想要精通算法和SQL的成长之路 - 存在重复元素 前言一. 存在重复元素II二. 存在重复元素III2.1 基于红黑树增删改查 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 存在重复元素II 原题链接 思路: 我们用HashSet存储元素,做到去重的效果。同时存储…

想要精通算法和SQL的成长之路 - 存在重复元素

  • 前言
  • 一. 存在重复元素II
  • 二. 存在重复元素III
    • 2.1 基于红黑树增删改查

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 存在重复元素II

原题链接
在这里插入图片描述

思路:

  1. 我们用HashSet存储元素,做到去重的效果。同时存储的元素个数,固定在k个。这个HashSet相当于是一个滑动窗口了。
  2. 那么从左往右遍历,不断地往HashSet中塞元素,一旦超过容量,剔除滑动窗口最左侧元素。set.remove(nums[i - k - 1]);
  3. 遍历过程中,一旦发现当前元素存在于HashSet中,直接返回true即可。

代码如下:

public boolean containsNearbyDuplicate(int[] nums, int k) {HashSet<Integer> set = new HashSet<>();for (int i = 0; i < nums.length; i++) {// 滑动窗口只存储k个元素,超过了,则移除if (i > k) {set.remove(nums[i - k - 1]);}if (set.contains(nums[i])) {return true;}set.add(nums[i]);}return false;
}

二. 存在重复元素III

原题链接
在这里插入图片描述
我们先来一个最简单的思路,暴力法:

  1. 针对每个元素,作为滑动窗口的左边界。往后固定indexDiff长度的区间。
  2. 我们在[left,left+indexDiff] 区间内遍历数组,计算差值。如果满足差值 < valueDiff 值,说明找到满足条件的结果,返回true

但是,这种操作,有着大量的重复计算,而且数组的无规律性,在最坏的情况下,我们得遍历整个长度为 k 的区间数组。那咋办呢?

思路如下:

  1. 我们可以维护一个有序并且长度为 k 的滑动窗口。那么对于该区间的任意一个数字num。既然要满足差值 < valueDiff 值。那么在这个有序的集合当中。哪个数字最满足条件?
  2. 第一种:小于等于 num 的最大值。第二种:和大于等于num的最小值即值num左右两侧最靠近的数值是我们想要的。
  3. 那么对于有序的数组而言,想要查找上面两个数,用哪种方式最合适?二分法。
  4. 当然,我们还需要不断地维护这个滑动窗口对应的数据结构。

2.1 基于红黑树增删改查

下面来自百度百科的相关红黑树介绍:

  • 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过若干次特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
  • 而这个特定操作,对于红黑树而言,可以限制到最多三次。
  • 它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的 n 是树中元素的数目。

针对上面的功能,红黑树都具备其查询:

  • 查询不超过num的最大值:floor函数。注意:如果找不到则返回null
  • 查询超过num的最小值:ceiling函数。注意:如果找不到则返回null

那么我们就不难写出代码:切记,对象和基本数据类型的比较,要判断null,否则会报空指针哦~

// floorNum <= num ,最大值
Long floorNum = tree.floor(num);
// ceilingNum >=num ,最小值
Long ceilingNum = tree.ceiling(num);
if (floorNum != null && num - floorNum <= valueDiff) {return true;
}
if (ceilingNum != null && ceilingNum - num <= valueDiff) {return true;
}

由于题目的元素值存在以下范围:
在这里插入图片描述
因此我们在存储的时候,要把它转成Long型。最终代码如下:

public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {TreeSet<Long> tree = new TreeSet<>();for (int i = 0; i < nums.length; i++) {// int 转 long,因为限制问题long num = nums[i] * 1L;// floorNum <= num ,最大值Long floorNum = tree.floor(num);// ceilingNum >=num ,最小值Long ceilingNum = tree.ceiling(num);if (floorNum != null && num - floorNum <= valueDiff) {return true;}if (ceilingNum != null && ceilingNum - num <= valueDiff) {return true;}tree.add(num);// 超过了滑动窗口大小if (i >= indexDiff) {tree.remove(nums[i - indexDiff] * 1L);}}return false;
}
http://www.sczhlp.com/news/118857/

相关文章:

  • 国外服装设计师网站深圳专业做网站技术
  • 平面设计有什么网站网站开发前后台整个流程
  • 什么样的笔记本电脑适合网站开发类似织梦cms
  • 基层建设论文收录在哪个网站手机商城网站建设策划方案范文
  • 自己如何做外贸公司网站小说阅读网站开发
  • YOLO进阶提升 5标注与配置
  • rapidxml中接口函数
  • YOLO进阶提升 6模型训练与测试
  • 医疗网站建设公司设计网站横幅
  • 群晖wordpress搭建网站wordpress使用密码
  • 网站怎么做架构兰考网站建设
  • 搭建网站论坛怎么注册自己网站
  • 做专属淘客网站宁波建网站如何收费
  • 怎么做品牌推广网站logo设计理念简短范文
  • 不会编程能做网站吗北京企业信用信息网官网
  • 网站开发大赛目录排版设计
  • YOLO进阶提升 4训练准备与数据处理
  • 网站的用户体验龙岩网站开发
  • windows安装elasticsearch
  • YOLO进阶提升 5标注与配置补充
  • php网站开发就业前景网页设计简单教程
  • 公司外贸网站怎么做建设项目竣工环保验收公示网站
  • python爬虫做网站平面设计广告公司
  • 建个网站要多少钱济南市建设局网站查房产信息
  • YOLO进阶提升 3YOLOv4 改进
  • 解码C语言位字段
  • Sql Server 多层嵌套事务的执行结果
  • 为何网站打开慢seo站外优化平台
  • 装修公司资质查询官方网站百度指数的数值代表什么
  • 国内做免费视频网站有哪些网约车平台