最近逐渐培养成了写每日一题的好习惯…
vs官方题解
与官方题解其实差不多,从我注释中删掉的unordered_map就能看出来,区别只在于我使用的是数组,而官方题解使用了哈希表。
其实,在本题中,int类型的数组是最推荐的。虽然哈希表有快速访问的特性,可以有现成的find函数,但是因为题目数据限制1 <= arr[i], pieces[i][j] <= 100且整数 互不相同,如果使用数组,还能够利用数组可以随机遍历的特性按下标直接访问。这不比find快么,hhh
思路
- 建立一个大小为101(存0~100)的nums数组,开始全设为-1
- arr中只要出现过某个字符,就把nums中这一位置为arr中的顺序
- 对于pieces数组,首先验证只有一位的在不在arr中,其次验证不止一位的顺序对不对。
class Solution {
public:
bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces)
{
vector<int> nums(101,-1);
for(int i=0;i<arr.size();++i)
{
nums[arr[i]] = i;
}
//unordered_map<int,int>umap;
//auto it = umap.begin();
//for(int i=0;i<arr.size();++i)
//{//}
for(int i=0;i<pieces.size();++i)
{
if(pieces[i].size() == 1 && nums[pieces[i][0]]==-1)
return 0;
else if(pieces[i].size()!=1)
{
int temp = nums[pieces[i][0]];
if(temp == -1)
return 0;
for(int j = 1;j<pieces[i].size();j++)
{
if(nums[pieces[i][j]] - temp != 1)
return 0;
else
++ temp;
}
}
}
return 1;
}
};
踩坑
第一次做的时候把vector nums(101,-1);设置成了大小为100,导致只通过了几个测试案例,含有100的全溢出了。很快反应过来了,也不想大修代码,索性把nums多加一位。