题目: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);