算法小知识-----8.24-----通过翻转子数组使两个数组相等

75 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

快乐周三,虽然正值台风天,但是依然难掩开心

通过翻转子数组使两个数组相等

该题出自力扣的1460题 —— 通过翻转子数组使两个数组相等【简单题】,确实是简单题,因为可以用多种办法实现

审题

给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。

  • 如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。

image.png

  • 题意很简单,就是给出两个长度一致的数组,任意翻转后面的数组,是否能够成为第一个数组
  • 本质上就是判断两个数组是否一致,所以可以用简单的暴力方法
  • 排序 + 判断
    • 这个方法最直接,就是调库
    • 直接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);
    }
}

image.png