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

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

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 = 0Output: true

Example 2:

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

Example 3:

Input: nums = [1,5,9,1,5,9], k = 2, t = 3Output: false

------------------------------------------------------------------------------

This is a good question!!! A sliding window with length t will results in TLE. Therefore, techniques for improvents are expected. Bucket partition is a good choice here. Cut nums into ... [0, t] [t+1,2t+1] ..., nums in the same bucket are obviously true. For every num, it's impossible to put 2 nums in the same adjacent bucket. So it has at most 1 num standing for the adjacent bucket. That's enough for this problem. 

class Solution:    def containsNearbyAlmostDuplicate(self, nums, k, t):        d = {}        w = t+1        for i in range(len(nums)):            bid = nums[i] // w            if (bid in d):                return True            elif (bid-1 in d and abs(d[bid-1]-nums[i]) <= t):                return True            elif (bid+1 in d and abs(d[bid+1]-nums[i]) <= t):                return True            d[bid] = nums[i] #bug3: 忘了            if (i>=k): #bug1: 这次有效,下次就无效的桶                d.pop(nums[i-k] // w) #bug2: i-k,瞎啊        return Falses = Solution()print(s.containsNearbyAlmostDuplicate([1,2,3,1],3,0))print(s.containsNearbyAlmostDuplicate([1,0,1,1],1,2))print(s.containsNearbyAlmostDuplicate([1,5,9,1,5,9], 2, 3))

Another solution is maintaining the sliding window as BST. BST requires 4 operations: getCeiling, getFloor, insert, remove(k). In c++, set (insert, erase, upper_bound, lower_bound) could be used. In java, TreeSet could be used. In Python, no corresponding object for the time being.

Copy from discussion:

bool containsNearbyAlmostDuplicate(vector
& nums, int k, int t) { set
window; // set is ordered automatically for (int i = 0; i < nums.size(); i++) { if (i > k) window.erase(nums[i-k-1]); // keep the set contains nums i j at most k // |x - nums[i]| <= t ==> -t <= x - nums[i] <= t; auto pos = window.lower_bound(nums[i] - t); // x-nums[i] >= -t ==> x >= nums[i]-t // x - nums[i] <= t ==> |x - nums[i]| <= t if (pos != window.end() && *pos - nums[i] <= t) return true; window.insert(nums[i]); } return false;}

 

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

你可能感兴趣的文章
Linux如何查看端口状态
查看>>
Guava cache 缓存
查看>>
UUID.randomUUID()是什么
查看>>
TimeUnit是什么
查看>>
2017年大数据的变化趋势
查看>>
作业、任务、进程、线程的区别
查看>>
laypage分页
查看>>
ojdbc14.jar 与ojdbc6.jar的区别
查看>>
如何区分Oracle的数据库,实例,服务名,SID
查看>>
怎样使用sqlplus连接oracle11g数据库
查看>>
JDBC连接数据库
查看>>
java日志组件介绍(common-logging,log4j,slf4j,logback )
查看>>
java运行jar命令提示没有主清单属性
查看>>
使用Maven为一个项目生成多个Jar包,将一个目录打成jar包
查看>>
CMD命令名详细大全
查看>>
C、C++、MATLAB、Python、Go 哪个比较适合写算法
查看>>
Spring的一个命名空间的名称空间处理程序没有找到
查看>>
Maven常用插件配置和使用
查看>>
spring.schemas、spring.handlers的使用
查看>>
命名空间
查看>>