刷题的日常-通过翻转子数组使两个数组相等

67 阅读2分钟

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

刷题的日常-2022年8月24日

一天一题,保持脑子清爽

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

来自leetcode的 1460 题,题意如下:

给你两个长度相同的整数数组target和arr。每一步中,你可以选择arr的任意 非空子数组并将它翻转。你可以执行此过程任意次。
如果你能让 arr变得与 target相同,返回 True;否则,返回 False 。

示例如下:

输入: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 的方法。

理解题意

我们可以从题意中提取的条件如下:

  • 给定两个数组
  • 数组里的数据是无序的
  • 要求我们反转子数组
  • 如果通过任意次翻转两个数组能够匹配上,返回true,否则返回false

做题思路

其实不需要进行翻转就可以知道,如果数组里面的数是完全相同的,那么一定可以翻转匹配,所以我们可以用贪心的思想解题:

  • 判断两个数组长度是否一样,不一样当然无法匹配,直接返回false即可
  • 将两个数组进行排序
  • 拍完序之后,两数组的内容完全相同的话那么每个元素都应该是一样的
  • 如果出现不一致的元素,返回false即可 另外一种思路是通过Hash表去保存相同元素出现的次数,如果每个元素出现的次数相同,那么也是可以通过翻转子数组最总达到一致的状态,这里就不提供代码了、

代码实现

代码实现如下:因为要进行排序,所以时间复杂度为O(arr.length)

public class Solution {
    public boolean canBeEqual(int[] target, int[] arr) {
        if (target.length != arr.length) {
            return false;
        }
        Arrays.sort(target);
        Arrays.sort(arr);
        for (int i = 0, len = target.length; i < len; i++) {
            if (target[i] != arr[i]) {
                return false;
            }
        }
        
        return true;
    }
}