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即可。
代码:
做法2:使用vector<pair<int,int>>,然后make_pair<序列的值,其对应的序号>,然后按照序列的值进行排序(其中序列的值和序号都按照从小到大,序列的值优先排)。
然后循环比较,如果vec[i].first==vec[i-1].first那么看看它们的second值差是否小于等于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 }
相关文章推荐
- 防范型问题的处理方法
- linux shell常用语法
- <Javascript> 对象中方法的调用
- MyCat 学习笔记 第十一篇.数据分片 之 分片数据查询 ( select * from table_name limit 100000,100 )
- [LeetCode] 158. Read N Characters Given Read4 II - Call multiple times
- 监听事件方法之通知/代理/kvo
- Cocos2d-x中ImageView的使用
- 个人笔记 css 03 设置表格显示外边框
- Java学习——Servlet跳转的配置
- git常用命令
- FZU 1686 神龙的难题(重复覆盖|Dancing Links)
- 9 集合
- 如何发现war工程运行期间是否有僵死的servlet线程
- 【推荐】大规模的自然场景文字检测与识别数据库
- 计算机网络3--计算机网络结构
- 为啥要用模板引擎呢?
- ActiveMQ 集群(1)
- MySQL 存储过程 批量插入
- 贝叶斯的路——概率论迷思
- js的一些总结