码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】Contains Duplicate II 解题小结

时间:2016-08-23 06:53:24      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

题目: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 difference between i and j is at most k.

题目意思就是判断在一个数组中是否存在两个相同的元素,他们之间的距离在k以内。

自己开始的思路是嵌套的两个for循环,但是当数组很大的时候程序超时了。后来看了下题目讨论里的发言,顺便学习了下map的概念,会用之后还是挺简单的。

代码如下:

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
/* 声明一个unordered_map m; */ unordered_map
<int, int> m ;
     /* 遍历数组 */
for (int i = 0; i < nums.size(); ++i) {
/* 查找m中是否存在这个元素,若不在,则插入这个元素; 若这个元素在m中,则判断当前
的位置i与查找到的nums[i]这个数的距离是否在k以内
if (m.find(nums[i]) != m.end() && i - m[nums[i]] <= k) return true; else m[nums[i]] = i; } return false; } };

借机也学习一下map的概念。

      map是键-值(key-value)对的集合,是一种关联容器(Associative Container)。通常我们可以将其理解是一种关联数组(Associative Container),因为我们可以把键值(key)当做是一种下标来获取值(value)。只不过这个下标的形式较为广泛,不光是int。键值(key)的类型必须定义有一个相关的比较函数,并且在键类型上定义“严格弱排序”。对于键类型,唯一的约束就是必须支持“<”操作符。如果是自定义类型的话,那么就还需要自定义这个“<”操作符,并且保证能正确工作。

      针对该题详细讨论下unordered_map。

      unordered_map使用的时候需要在头文件上包含unordered_map.h头文件。它的特性主要有:

1、关联性:通过key去检索value(不是绝对地址)

2、无序性:使用hash表存储,内部无序

3、Map:每个值对应一个键值

4、键唯一性:不存在相同的两个键

5、动态内存管理:使用内存管理模型来动态管理所需要的内存空间

构造方式:

有以下几种:

1、构造空的容器

unordered_map<int, int> map1;

2、复制构造

unordered_map<int, int> map2(map1);

3、范围构造

unordered_map<int, int> map3(iter.begin(), iter.end());

4、用数组构造

unordered_map<int, int> map4({1,2},{4,5});

容量操作:

1、size_type size() const noexcept; 返回unordered_map的大小;

2、bool empty() const noexcept; 是否为空?true:false。  

元素操作:

1、iterator find (const key_type& k)

  查找key所在的元素,如果找到,返回元素的迭代器;没找到,返回unordered_map::end。

2、insert 插入有以下几种方式

复制插入:

unordered_map<int, int> mapInsert;
/* 复制插入 */
mapInsert.insert(map1);  

范围插入:

/* 范围插入 */
mapInsert.insert(map1.begin(), map2.end());  

初始化数组插入:

/* 数组插入 */
mapInsert.insert({{1,2}{4,5}});  

数组形式插入:

/* 数组插入 */
mapInsert.insert[3] = 10 ;  

3. mapped_type& at (const key_type& k);

查找key所对应的值,若存在,返回key对应的值;若不存在,抛出out_of_range异常。

4. erase 擦除元素的方式有

通过位置(迭代器)

/* 通过位置擦除 */
mapErase.erase(map1.begin()); 

通过key

/* 通过key擦除 */
mapErase.erase(1); 

通过范围

/* 通过范围擦除 */
mapErase.erase(map1.begin(), map2.end()); 

5. void clear() noexcept 清空unordered_map

6. void swap( unordered_map& ump);

/* 交换两个unordered_map的所有元素!!! */
mapSwap.swap(map); 

 

【LeetCode】Contains Duplicate II 解题小结

标签:

原文地址:http://www.cnblogs.com/Doctengineer/p/5797839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!