2022-8-20 剑指offer-滑动窗口+(桶排序或者有序集合)
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
1 class Solution { 2 public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { 3 int n=nums.length; 4 for (int i=0;i<Math.max(n-k,n);i++){ 5 for (int j=i+1;j<=Math.min(i+k,n-1);j++){ 6 long l=nums[i],r=nums[j]; 7 //System.out.print(Math.abs(l-r)); 8 if (Math.abs(l-r)<=t) return true; 9 } 10 } 11 return false; 12 } 13 }
思路:维护一个滑动窗口。
桶排序:根据t+1为间隔分桶,相同桶或者相邻桶可能出现符合的情况。
有序集合:treeset可以利用ceiling和flooring两个函数得到距离当前元素最近的两个值。
浙公网安备 33010602011771号