您的位置:首页 > 大数据 > 人工智能

LeetCode Contains Duplicate III

2015-06-07 11:31 429 查看
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.

要是面试,那么我已经跪了

class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if (t < 0 || k <1) {
return false;
}
long bucket_size = (long)t + 1;
long len = nums.size();
unordered_map<long, long> buckets;
for (long i=0; i<len; i++) {
long val = nums[i] - (long)INT_MIN;
long bucket = val / bucket_size;
// check duplicates in buckets[bucket-1], buckets[bucket], buckets[bucket+1]
if (buckets.count(bucket) > 0
|| buckets.count(bucket-1) > 0 && val - buckets[bucket - 1] <= t
|| buckets.count(bucket+1) > 0 && buckets[bucket + 1] - val <= t) {
return true;
}
// maintain buckets entries in a k size window (the index constrains)
if (buckets.size() >= k) {
int bucket2del = (nums[i - k] - (long)INT_MIN) / bucket_size;
buckets.erase(bucket2del);
}
buckets[bucket] = val;
}
return false;
}
};


用set不靠谱啊,这个提示binary search tree难道不是这么用,直接TLE了:

class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if (t < 0 || k <1) {
return false;
}
int len = nums.size();
set<long> win;

for (int i=0; i<len; i++) {
long val = nums[i];
auto lo = lower_bound(win.begin(), win.end(), val - t);
if (lo != win.end()) {
if (abs(*lo - val) <= t) {
return true;
} else {
// not found
}
}
// sliding window
if (i >= k) {
win.erase(nums[i - k]);
}
win.insert(val);
}

return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: