给你一个整数数组 arr ,数组中的每个整数 互不相同 。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。

来源:力扣(LeetCode)

由于题目中不允许对存储在数组中的整数进行排序,我们可以使用哈希表来解决这个问题

先决知识

unordered_map 容器基本介绍

unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。

我们创建一个都是整数类型的map来记录数据之间的联系关系unordered_map<int, int> match

对于生成的map match,我们通过auto it = mathc.begin()来获取这个map的第一个元素,接下来我们就可以 通过it来访问这整个元素 通过it->first来访问这个元素的key值 通过it->second来访问这个元素的value值

auto 基本介绍

根据后面的值,来自己推测前面的类型是什么,从而简化变量初始化的操作,而且一次进行定义时,需要定义的变量也都是同一类型

解题整体思路

对于给定序列中的数,首先从链接中的第一个数字开始比较 找到之后,查看链接中是否还有后续的数字 若有,在给定序列中查看是否符合 若无,从当前链接的首位在列表中首位的前一位或末位在列表中的后一位进行下次比较 全部比较完后即为true

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
    bool canFormArray(vector<int> &arr, vector<vector<int>> &pieces) {
        unordered_map<int, int> match;
        //初始化哈希表,将需要链接的首位存入
        for (int i = 0; i < pieces.size(); i++) {
            match[pieces[i][0]] = i;
        }
        for (int i = 0; i < arr.size();) {
            //自动初始化it并且在链接列表中找是否有可供链接的节点
            auto it = match.find(arr[i]);
            //如果无法链接,直接返回false
            if (it == match.end()) {
                return false;
            }
            //倘若链接头的值和源列表中的头的值相等,那么进行下一步的比较
            for (int x : pieces[it->second]) {
                //倘若链接中部的值和源列表的顺序不同,则返回false
                if (arr[i++] != x) {
                    return false;
                }
            }
        }
        //完全符合则直接结束
        return true;
    }
};