输入:两个长度相同的数组 target 和 arr
要求:可以对 arr 执行任意次数的 非空子数组翻转,判断是否能变成 target。
输出:true / false
思路:子数组翻转的本质是「任意重排」。因为连续片段随便反转,等价于可以把数组排序成任意顺序。
所以最终只需要判断两个数组的 元素种类 和 出现次数 是否完全一样。
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
bool canBeEqual(vector<int>& target, vector<int>& arr) {
unordered_map<int,int> cnt1, cnt2;
for (int x : target) cnt1[x]++;
for (int x : arr) cnt2[x]++;
return cnt1 == cnt2;
}
};

被折叠的 条评论
为什么被折叠?



