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


    题目描述

    给你两个长度相同的整数数组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的方法。

    解题思路

    1. 如果2个数组的元素是一致的,那么通过任意次数翻转后,一定能得到目标数组;

    2. 判断2个数组的元素是否一致,可以使用哈希表,来解决问题。

    代码实现如下:

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. class Solution1 {
    4. public boolean canBeEqual(int[] target, int[] arr) {
    5. if (target.length != arr.length) {
    6. return false;
    7. }
    8. Map mapTarget = new HashMap<>(target.length);
    9. Map mapArr = new HashMap<>(arr.length);
    10. for (int c : target) {
    11. int count = mapTarget.getOrDefault(c, 0);
    12. mapTarget.put(c, ++count);
    13. }
    14. for (int c : arr) {
    15. int count = mapArr.getOrDefault(c, 0);
    16. mapArr.put(c, ++count);
    17. }
    18. for (Map.Entry entry : mapArr.entrySet()) {
    19. Integer count = mapTarget.get(entry.getKey());
    20. if (count == null) {
    21. return false;
    22. }
    23. if (entry.getValue() != count) {
    24. return false;
    25. }
    26. }
    27. return true;
    28. }
    29. }

    代码优化

    上面的代码在耗时上还比较高,考虑使用数组代替哈希表,根据题目意思:

    target.length == arr.length
    1 <= target.length <= 1000
    1 <= target[i] <= 1000
    1 <= arr[i] <= 1000

    那么只需要初始化的数组大小为1001就可以了,具体实现代码如下:

    1. class Solution {
    2. public boolean canBeEqual(int[] target, int[] arr) {
    3. int[] mapTarget = new int[1001];
    4. int[] mapArr = new int[1001];
    5. for (int c : target) {
    6. mapTarget[c]++;
    7. }
    8. for (int c : arr) {
    9. mapArr[c]++;
    10. }
    11. for (int i = 0; i < mapArr.length; i++) {
    12. if (mapArr[i] != mapTarget[i]) {
    13. return false;
    14. }
    15. }
    16. return true;
    17. }
    18. }

    这两种代码实现耗时差别如下:

    总结

    这道题解题思路上复杂度不高,核心还是降低耗时;欢迎有更简单、高效的思路回复。

  • 相关阅读:
    将PyCharm中的终端运行前面的PS修改成当前环境
    引领汽车潮改新风向,看“菱大师”柳州炫技
    GBase 8a事务控制
    解决自动驾驶落地难点,全自动驾驶才是未来
    2022年深信服杯四川省大学生信息安全技术大赛-CTF-Reverse复现(部分)
    react-创建组件的两种方式
    关于Java中的运算符
    Mac电脑VSCode配置PHP开发环境
    解决使用ElementUI进行几个日期选择器之间的切换时,弹出框位置出错的问题
    Python数学基础-识图一、平面直角坐标系
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126513901