【2022-08-24每日一题】1460. 通过翻转子数组使两个数组相等

2022-08-24
2分钟阅读时长

2022-08-24每日一题:1460. 通过翻转子数组使两个数组相等

  • 难度:Easy
  • 标签:数组 、 哈希表 、 排序

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

方法一:排序判断数组元素是否相同

func canBeEqual(target []int, arr []int) bool {
    sort.Ints(target)
    sort.Ints(arr)
    for i, n := range target {
        if n != arr[i] {
            return false
        }
    }
	return true
}

复杂度分析

  • 时间复杂度: O(n×logn),其中 n是输入数组的长度。排序消耗 O(n×logn) 复杂度,判断是否相同消耗 O(n)复杂度。

  • 空间复杂度:O(logn)

方法二:哈希表判断数组元素是否相同

func canBeEqual(target []int, arr []int) bool {
    cnt := map[int]int{}
    for i, x := range target {
        cnt[x]++
        cnt[arr[i]]--
    }
    for _, c := range cnt {
        if c != 0 {
            return false
        }
    }
    return true
}

复杂度分析

  • 时间复杂度:O(n),其中 n*n 是输入数组的长度,统计并判断频次是否相同消耗 O(n)。

  • 空间复杂度:O(n),哈希表最多消耗 O(n)空间。

方法三:

思路

当两数组词频相同,且翻转次数不受限制时,我们至少能通过「逐个调整」将一数组变为另一数组(以当前需要调整的位置作为待翻转子数组的左端点,目标数值所在位置作为右端点)。

代码

func canBeEqual(target []int, arr []int) bool {
    toc, cnt := 0, [1010]int{}
    for i, x := range target {
        if cnt[x]++; cnt[x] == 1 {
            toc++
        }
        if cnt[arr[i]]--; cnt[arr[i]] == 0 {
            toc--
        }
    }
    return toc == 0
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(C),其中 C = 1010 为值域大小

LeetCode题库地址