220存在重複元素 III(滑動窗口+哈希表)

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章