题目描述
思路
哈希表
如果arr长度为1,可以直接判断arr是否和target相同,因为无论如何翻转,都不会改变数组。
如果arr长度大于1,只需要满足arr和target的元素相同,arr就能通过若干次操作变为target。这主要是因为通过一次或两次翻转操作,必然可以交换arr数组中的任意两个元素的位置并且保持其他元素的位置不变。如果像交换两个相邻元素的位置,只需要翻转这两个元素组成的子数组即可;如果交换非相邻的两个元素,则翻转这两个元素及两个元素之间所有元素,之后在翻转两个元素之间的所有元素,即可实现翻转两个元素,其他元素位置不变。
Python实现
class Solution:
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
return Counter(target) == Counter(arr)
Java实现
class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
Map<Integer, Integer> counts1 = new HashMap<>();
Map<Integer, Integer> counts2 = new HashMap<>();
for (int num : target) {
counts1.put(num, counts1.getOrDefault(num, 0)+1);
}
for (int num : arr) {
counts2.put(num, counts2.getOrDefault(num, 0)+1);
}
for (Map.Entry<Integer, Integer> entry : counts1.entrySet()) {
int key = entry.getKey(), value = entry.getValue();
if (!counts2.containsKey(key) || counts2.get(key) != value) {
return false;
}
}
return true;
}
}
C++实现
class Solution {
public:
bool canBeEqual(vector<int>& target, vector<int>& arr) {
unordered_map<int, int> counts1, counts2;
for (int num : target) {
counts1[num]++;
}
for (int num : arr) {
counts2[num]++;
}
for (auto &[key, value] : counts1) {
if (!counts2.count(key) || counts2[key] != value) {
return false;
}
}
return true;
}
};
排序
思路与哈希表类似,只不过哈希表是对数组进行统计,排序是对数组进行从大到小排序后看看两个数组是否相等,如果相等,就说明可以通过翻转得到。代码就不再实现。