您的位置:首页 > 其它

LeetCode219 查找相等两个数之间的最小距离

2016-02-02 23:51 260 查看
题意:给定一个vector<int>类型的int序列以及int k,问这个序列中是否存在两个相等的数且两者之间的序号差不超过k。

题解:

做法一:使用unordered_map。

哈希map是一种关联容器,通过键值和映射值存储元素。允许根据键值快速检索各个元素。在unordered_map中,键值一般用来唯一标识元素,而对应的值是一个对象关联到这个键的内容。键映射值的类型可能会有所不同。在内部unordered_map的元素不以键值或映射的元素作任何特定的顺序排序,其存储位置取决于哈希值允许直接通过其键值为快速访问单个元素(具有恒定平均的平均时间复杂度)。unordered_map容器比map容器更快地通过键值访问他们的单个元素,虽然unordered_map一般都是比map通过其元素的一个子集范围迭代效率低。哈希map允许使用操作运算符(运算符[])以其键值作为参数直接访问元素。
首先设计一个unordered_map<int,vector<int>>,键值设计为序列中的数,映射的值设计为这个数对应的位置,因为会有重复的数,这个时候键值唯一,我们把其对应的位置都加入到一个vector<int>里,然后设计一个大的vector<vector<int>>,将每个重复数字的位置,加入到一个新的vector里边,再对每个数字里头的序号进行排序,最后检查两个相邻的序号之间的差是否小于k即可。
代码:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int i = 0,j=0;
if (k <= 0){
return 0;
}
else{
unordered_map<int,vector<int>> map;
for(i=0;i<nums.size();i++){
map[nums[i]].push_back(i);
}
vector<vector<int>> vec;

for(auto x=map.begin();x!=map.end();x++){
if(x->second.size()>1)
vec.push_back(x->second);
}

for(i=0;i<vec.size();i++){
sort(vec[i].begin(),vec[i].end());
int dis=INT_MAX;
for(j=1;j<vec[i].size();j++){
dis=min(dis,vec[i][j]-vec[i][j-1]);
}
if(dis<=k)
return true;
}
return false;
}
}
};


做法2:使用vector<pair<int,int>>,然后make_pair<序列的值,其对应的序号>,然后按照序列的值进行排序(其中序列的值和序号都按照从小到大,序列的值优先排)。
然后循环比较,如果vec[i].first==vec[i-1].first那么看看它们的second值差是否小于等于k。
代码:
bool containNearbyDuplicate(vector<int>& nums, int k){
vector<pair<int, int>> vec;
if (nums.size() < 2){
return 0;
}
int i;
for (i = 0; i < nums.size(); i++){
vec.push_back(make_pair(nums[i],i));
}
sort(vec.begin(),vec.end(),compare);
for (i = 1; i < vec.size(); i++){
if (vec[i].first == vec[i - 1].first&&vec[i].second - vec[i - 1].second <= k){
return 1;
}
}
}
static bool compare(pair<int,int>x,pair<int,int>y){
if (x.first == y.first)
return x.second < y.second;
else
return x.first<y.first

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