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

97 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

题目 leetcode.cn/

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

    • 输入: target = [7], arr = [7]
    • 输出: true
    • 解释: arr 不需要做任何翻转已经与 target 相等。
  • 示例 3:

    • 输入: target = [3,7,9], arr = [3,7,11]
    • 输出: false
    • 解释: arr 没有数字 9 ,所以无论如何也无法变成 target 。

提示:

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

代码

function canBeEqual(target: number[], arr: number[]): boolean {
    let arrs = arr.sort((a, b) => { return a - b });
    let targets = target.sort((a, b) => { return a - b });
    for(let i = 0 ; i < targets.length; i++){
        if(targets[i] !== arrs[i]) {
            return false
        }
    }
    return true
};
  • 排序比较:
    • 这题应该算脑筋急转弯?其实也不用真的每次都去翻转子数组。要求返回的是target能否和翻转后的arr相等,那么只要判断arr数组内的每一项的值都与target内的值一一对应就行了。如果要求的是返回最少要翻转多少次才想等,那么难度直接上升一个等级
    • 怎么判断arr的每一项与tartget一一对应呢,对两个数组都进行排序。
    • 排序改变的是值的位置顺序,不改变值的大小和个数,排序完再对数组进行遍历,如果是targetarr能通过翻转后相等,那么排序后两个数组的每个下标的值都应该是相等的
    • 如果有一项不相等,那么返回false,否则返回true
function canBeEqual(target: number[], arr: number[]): boolean {
    for(let i = 0; i < target.length; i++){
        for(let k = 0; k < arr.length; k++){
            if(target[i] === arr[k]){
                arr.splice(k, 1);
                break;
            }
        }
    }
    return arr.length ? false : true;
};
  • 逐一排除:
    • 如果要使得arr对子数组翻转若干次后和target相等,那么数组target内的每一个值在数组arr中都能找到一个值与之对应
    • 循环遍历两个数组,如果在arr中找到arr[k]与当前的target[i]相等,那么从arr中删除掉这个值,并且退出当前遍历
    • 每次内循环都从下标为0开始,找到后删除并且退出当前循环,直到遍历完target最后一个值,如果能通过翻转相等,那么此时arr内的值应该都删完了,arr为空数组。如果不能通过翻转相等,那么此时arr一定是有值的。

结果:

  • 排序比较:

image.png

  • 逐一排除:

image.png