携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
快乐周三,虽然正值台风天,但是依然难掩开心
通过翻转子数组使两个数组相等
该题出自力扣的1460题 —— 通过翻转子数组使两个数组相等【简单题】,确实是简单题,因为可以用多种办法实现
审题
给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。
- 如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。
- 题意很简单,就是给出两个长度一致的数组,任意翻转后面的数组,是否能够成为第一个数组
- 本质上就是判断两个数组是否一致,所以可以用简单的暴力方法
- 排序 + 判断
- 这个方法最直接,就是调库
- 直接Arrays.sort方法,对两个数组分别进行排序
- 然后利用Arrays.equal的方法,对两个数组进行比较返回即可
- Hash + 比较
- 利用HashMap结构,对目标数组进行填充数据,key为值,value为出现次数
- 对翻转数组进行HashMap的校验
- 最后再次对HashMap判断是否存在多余的数值
- 如果arr 长度是 1,那么只需判断 arr 和 target 是否相同即可。因为此时翻转非空子数组的过程并不会改变数组,只需判断原数组是否相同即可。
编码
class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
Map<Integer, Integer> counts1 = new HashMap<Integer, Integer>();
Map<Integer, Integer> counts2 = new HashMap<Integer, Integer>();
for (int num : target) {
counts1.put(num, counts1.getOrDefault(num, 0) + 1);
}
for (int num : arr) {
counts2.put(num, counts2.getOrDefault(num, 0) + 1);
}
if (counts1.size() != counts2.size()) {
return false;
}
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;
}
}
class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
Arrays.sort(target);
Arrays.sort(arr);
return Arrays.equals(target, arr);
}
}