1、題目描述
在整數數組 nums 中,是否存在兩個下標 i 和 j,使得 nums [i] 和 nums [j] 的差的絕對值小於等於 t ,且滿足 i 和 j 的差的絕對值也小於等於 ķ 。
如果存在則返回 true,不存在返回 false。
2、示例
輸入: nums = [1,2,3,1], k = 3, t = 0
輸出: true
輸入: nums = [1,5,9,1,5,9], k = 2, t = 3
輸出: false
3、題解
解法一:
基本思想:滑動窗口+哈希表,用哈希表來維護這個k大小的滑動窗口,如果下一個插入的元素與插入位置的左右兩邊元素絕對值小於等於t,返回true,否則加入到滑動窗口,同時滑動窗口去掉最舊的元素。
解法二:
基本思想:滑動窗口 + multiset,滑動窗口大小爲k,遍歷nums所有元素
- 如果滑動窗口大小小於等於k,插入當前的元素,同時比較插入的元素與左右兩邊元素的絕對值差是否小於等於t返回true
- 如果滑動窗口大小大於k,multiset去除左邊界元素,同時滑動窗口左邊界右移。
#include<algorithm>
#include<iostream>
#include<vector>
#include <iterator>
#include<set>
using namespace std;
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
//基本思想:滑動窗口+哈希表,用哈希表來維護這個k大小的滑動窗口
//如果下一個插入的元素與插入位置的左右兩邊元素絕對值小於等於t,返回true,否則加入到滑動窗口,同時滑動窗口去掉最舊的元素
set<long> container; //防止兩數相減超出int範圍
for (int i = 0; i < nums.size(); i++)
{
auto iter = container.lower_bound(nums[i]);
if (iter != container.end() && *iter - nums[i] <= t)
return true;
if (iter != container.begin() && nums[i] - *(--iter) <= t)
return true;
container.insert(nums[i]);
if (container.size() > k)
container.erase(nums[i - k]);
}
return false;
}
};
class Solution1 {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
//基本思想:滑動窗口 + multiset,滑動窗口大小爲k,遍歷nums所有元素
//如果滑動窗口大小小於等於k,插入當前的元素,同時比較插入的元素與左右兩邊元素的絕對值差是否小於等於t返回true
//如果滑動窗口大小大於k,multiset去除左邊界元素,同時滑動窗口左邊界右移。
if (nums.size() == 0)
return false;
multiset<int> container;
int left = 0, right = 1;
long long value1, value2;
container.insert(nums[left]);
while (right < nums.size())
{
if (right - left <= k)
{
auto iter = container.insert(nums[right]);
if (iter != container.begin())
{
value2 = *iter;
auto iter1 = iter;
value1 = *(--iter1);
if (value2 - value1 <= t)
return true;
}
if (iter != --container.end())
{
value1 = *iter;
value2 = *(++iter);
if (value2 - value1 <= t)
return true;
}
right++;
}
else
{
container.erase(container.find(nums[left]));
left++;
}
}
return false;
}
};
int main()
{
Solution solute;
vector<int> nums = { 3,6,0,4 };
int k = 2, t = 2;
cout << solute.containsNearbyAlmostDuplicate(nums, k, t) << endl;
return 0;
}