博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
220. Contains Duplicate III
阅读量:2351 次
发布时间:2019-05-10

本文共 2275 字,大约阅读时间需要 7 分钟。

题目

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.

Example 1:

Input: nums = [1,2,3,1], k = 3, t = 0

Output: true

我的想法

和II一样用双指针

遇到需要绝对值的题目,需注意整数的范围!!!

//记录一下错误做法class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if(k == 0 || nums.length <= 1) return false; int i = 0, j = 0; while(i < nums.length-1){
if(j - i == k || j == nums.length-1) {
j = ++i; continue;} j++; if(Math.abs(nums[j]-nums[i]) <= t) return true; }//改为Math.abs((long)nums[j]-(long)nums[i]即可 return false; }}

解答

leetcode solution 1: Using TreeSet

利用TreeSet的ceiling或者floor函数来优化查找

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

leetcode solution 2: Using HashMap

public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (k < 1 || t < 0) return false; Map
map = new HashMap<>(); for (int i = 0; i < nums.length; i++) {
long remappedNum = (long) nums[i] - Integer.MIN_VALUE; long bucket = remappedNum / ((long) t + 1); if (map.containsKey(bucket) || (map.containsKey(bucket - 1) && remappedNum - map.get(bucket - 1) <= t) || (map.containsKey(bucket + 1) && map.get(bucket + 1) - remappedNum <= t)) return true; if (map.entrySet().size() >= k) {
long lastBucket = ((long) nums[i - k] - Integer.MIN_VALUE) / ((long) t + 1); map.remove(lastBucket); } map.put(bucket, remappedNum); } return false; }}

转载地址:http://fbqvb.baihongyu.com/

你可能感兴趣的文章
JavaScript学习
查看>>
JavaScript学习总结
查看>>
JQuery学习总结笔记1
查看>>
JQuery学习笔记2
查看>>
代码质量及其优化(学习笔记)
查看>>
将代码托管到GitHub
查看>>
Java实现PDF的生成(使用IText)
查看>>
MySQL学习笔记
查看>>
数据库连接池
查看>>
MySQL性能优化经验
查看>>
MySQL学习参考
查看>>
Java工程结构管理(BuildPath/系统库/外部库)
查看>>
将代码托管到Coding
查看>>
JS-异步提交表单的几种方式
查看>>
作为一个Java初学者应该注意些什么呢?
查看>>
27岁转行自学Java,真的太晚了吗?
查看>>
自学Java最起码要学到什么程度才能就业?
查看>>
零基础学Java需要做哪些准备?需要注意些什么呢?
查看>>
有了这份阿里大牛手写630页Java高级面试手册,offer稳了【建议收藏】
查看>>
学习Java,需要学到什么程度,才能出去找工作?
查看>>