#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <unordered_map>
#include <set>
using namespace std;
/*
问题:
Given an array of integers and an integer k, find out whether there are two distinct
indices i and j in the array such that nums[i] = nums[j] and the absolute difference
between i and j is at most k.
分析:给定整数和整数k,找到是否有两个不同的下标i和j,使得nums[i]=nums[j],并且i和j的查找最多不超过k。
由于要记录下标信息,单纯的哈希已经需要存储一个结构体
<值,对应该值的下标集合>,考虑到下标本身需要排序,因此使用
unordered_map<int , set<int> >的结构
注意k没有说明是整数还是附属,i和j也没有说明
输入:
3 2
1 2 1
4 2
1 2 3 1
3 1
1 2 3
输出:
true
false
false
*/
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.empty() || k <= 0)
{
return false;
}
int size = nums.size();
unordered_map<int , set<int> > valueToIndexs;
for(int i = 0 ; i < size ; i++)
{
if(valueToIndexs.find(nums.at(i)) != valueToIndexs.end())
{
valueToIndexs[ nums.at(i) ].insert(i);
}
else
{
set<int> indexs;
indexs.insert(i);
valueToIndexs[ nums.at(i) ] = indexs;
}
}
//再次遍历一遍,看同一个值对应的下标集合中的下标之差是否 <= k
set<int> indexs;
int preIndex;
int curIndex;
for(unordered_map<int , set<int> >::iterator it = valueToIndexs.begin() ;
it != valueToIndexs.end() ; it++)
{
indexs = it->second;
//比较set中两个元素,需要获取上一个
preIndex = -1;
for(set<int>::iterator itFind = indexs.begin() ; itFind != indexs.end() ; itFind++)
{
curIndex = *itFind;
if(preIndex != -1)
{
if( curIndex - preIndex <= k)
{
return true;
}
}
preIndex = curIndex;
}
}
return false;
}
};
void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}
void process()
{
vector<int> nums;
int value;
int num;
Solution solution;
vector<int> result;
int maxDiff;
while(cin >> num >> maxDiff )
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
bool answer = solution.containsNearbyDuplicate(nums , maxDiff);
if(answer)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
leecode 解题总结:219. Contains Duplicate II
最新推荐文章于 2020-11-16 22:38:49 发布