220. Contains Duplicate III(核心:set数组有序/桶排序)
2021-03-11 21:29
标签:ice 自己 || 否则 大于 构造 put 大于等于 val 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: Example 2: Example 3: Constraints: //桶排序:这个很经典 桶宽(t+1) 220. Contains Duplicate III(核心:set数组有序/桶排序) 标签:ice 自己 || 否则 大于 构造 put 大于等于 val 原文地址:https://www.cnblogs.com/wsw-seu/p/14092268.htmlInput: nums = [1,2,3,1], k = 3, t = 0
Output: true
Input: nums = [1,0,1,1], k = 1, t = 2
Output: true
Input: nums = [1,5,9,1,5,9], k = 2, t = 3
Output: false
0
-231
0
0
class Solution {
public:
//|i-j| //|nums[i]-nums[j]| //正常思路:O(N*k)超时
//优化:1、O(N*logk).在 i--i+k中找是否在j使|nums[i]-nums[j]| //如果nums[i]--nums[i+k]有序,即可找 nums[i]-t = t+nums[i]
//即在有序数组中查找 大于等于nums[i]-t的数 是否存在? 二分(logk)活着lower_boud函数
//难点在于如何构造nums[i] -- nums[i+k]的有序数组? set
/*
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
STL的map、multimap、set、multiset都有三个比较特殊的函数,lower_bound、upper_bound、equal_range。
iterator lower_bound (const value_type& val) const;
iterator upper_bound (const value_type& val) const;
pair
class Solution {
public:
//桶排序:所有的数分桶,(t)为桶宽度范围。(t+1): 例如 t = 2, (0,1,2在桶0,3,4,5在桶1 ...
//获取nums[i]在哪个桶: 桶id从0开始,num小于0的话,例如 -1 / 2 == 0不行。
long getId(long num,long t) {
return num 0 ? (num+1)/(t+1)-1 : num/(t+1);
}
long Abs(long a) {
if(a 0) return -a;
return a;
}
//num -- num+t 会在一个桶内,如果 k哥元素范围内必有同范围内的,返回true
bool containsNearbyAlmostDuplicate(vectorint>& nums, int k, int t) {
//key 为ID ,value为nums[i]。至多一个value,否则就返回了
maplong,long> m;
int n = nums.size();
for(int i=0;i
上一篇:数组静态初始化和动态初始化
下一篇:迪杰斯特拉算法寻找最短路径
文章标题:220. Contains Duplicate III(核心:set数组有序/桶排序)
文章链接:http://soscw.com/index.php/essay/63376.html