【LeetCode】Contains Duplicate II 解题小结

题目: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); 
时间: 2024-10-10 07:31:13

【LeetCode】Contains Duplicate II 解题小结的相关文章

[leetcode]Contains Duplicate II解题报告 C语言

[题目] 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. [题目分析] 因为对于数值相同的两个数都距离范围研限制,那么,对每一个元素(除了最后一个元素)一一与它后面的

[LeetCode] Contains Duplicate(II,III)

Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct. 解题思路 用一个set保存数组中的值,如

【LeetCode】350. Intersection of Two Arrays II 解题小结

题目: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2]. 相比较I,这个题目允许答案出现重复的.想法就是做一个map统计nums1元素出现次数,然后nums2每次遍历都看看元素出现次数. class Solution { public: vector<int> intersect(

LeetCode: Unique Paths II 解题报告

Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle and empty spac

【LeetCode】Subsets II 解题报告

[题目] Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If S = [1,2,2], a solutio

LeetCode: Combination Sum II 解题报告

Combination Sum II Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. Each number in C may only be used once in the combination. Note:All numbers (including ta

【LeetCode】18. 4Sum 解题小结

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution set must not contain duplicate quadruplets. For ex

LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix:[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]] SOLUTION 1: 还是与上一题Spiral Matrix类似

LeetCode: Word Break II 解题报告

Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, given s = "catsanddog", dict = ["cat",