题目
给你两个长度相同的整数数组 target
和 arr
。每一步中,你可以选择 arr
的任意 非空子数组 并将它翻转。你可以执行此过程任意次。
如果你能让 arr
变得与 target
相同,返回 True;否则,返回 False 。
示例 1:
输入:target = [1,2,3,4], arr = [2,4,1,3]
输出:true
解释:你可以按照如下步骤使 arr 变成 target:
1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3]
2- 翻转子数组 [4,2] ,arr 变成 [1,2,4,3]
3- 翻转子数组 [4,3] ,arr 变成 [1,2,3,4]
上述方法并不是唯一的,还存在多种将 arr 变成 target 的方法。
示例 2:
输入:target = [7], arr = [7]
输出:true
解释:arr 不需要做任何翻转已经与 target 相等。
示例 3:
输入:target = [3,7,9], arr = [3,7,11]
输出:false
解释:arr 没有数字 9 ,所以无论如何也无法变成 target 。
提示:
target.length == arr.length
1 <= target.length <= 1000
1 <= target[i] <= 1000
1 <= arr[i] <= 1000
解题
方法一:计数
思路
可以选择 arr
中的任意非空子数组并将它翻转,也就是说所有元素的位置都可以随意变更(类似冒泡排序),那么只要两个数组中所有数字相同就能让两个数组变得相同。而两个数组的长度是相同的,也就是说过两数组如果不同则一定会在一个数组中出现不同的数字,或者相同数字的数量不同。那么维护一个计数哈希表,在 target
中把数字对应计数加一,在 arr
中把数字对应计数减一,其中如果某个数字的计数小于 0,那么两个数组一定不同。1 <= target[i], arr[i] <= 1000
所以用数组代替哈希表做计数。
代码
class Solution {
public:
bool canBeEqual(vector<int>& target, vector<int>& arr) {
int cnts[1001] = {0};
for (const int& num : target) ++cnts[num];
for (const int& num : arr) {
if (--cnts[num] < 0) return false;
}
return true;
}
};
class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
int[] cnts = new int[1001];
for (int num : target) ++cnts[num];
for (int num : arr) {
if (--cnts[num] < 0) return false;
}
return true;
}
}
评论区