本文共 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) { TreeSetset = 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; Mapmap = 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/