leetcode 220
- 问题描述:
对于给定数组,是否存在两个元素,其下标间距不大于k,元素值间距不大于t
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int CalculateIndex(int x , int t){
return (x>=0)?(x/t):(x/t - (x%t)?1:0);
}
int Absolute(int x, int y){
return (x>=y)?(x-y):(y-x);
}
bool FindNearbyAlmostDuplicate(vector<int> &a, int index_gap , int value_gap){
if(value_gap < 0 || index_gap < 1){
return false;
}
value_gap = max(value_gap , 1);
index_gap++;
map<int,int> have;
for(int i = 0; i < a.size(); i++){
if(i >= index_gap){
have.erase(CalculateIndex(a[i-index_gap],value_gap));
}
int index = CalculateIndex(a[i],value_gap);
if(have.find(index) != have.end()){
return true;
}
map<int,int>::iterator it = have.find(index - 1);
if(it != have.end() && ( Absolute(it->second , a[i]) <= value_gap )){
return true;
}
it = have.find(index + 1);
if(it != have.end() && ( Absolute(it->second , a[i]) <= value_gap )){
return true;
}
have.insert(make_pair(index,a[i]));
}
return false;
}
int main()
{
int a[100] = {0};
for(int i = 0 ; i < 100; i++){
a[i] = rand()%10000;
}
cout<<a[2]<<" "<<a[4]<<endl;
vector<int> v(a,a+100);
cout<<FindNearbyAlmostDuplicate(v,3,10)<<endl;
return 0;