【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 为值域大小