携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
题目
leetcode1460. 通过翻转子数组使两个数组相等
给你两个长度相同的整数数组 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
题解
当两数组词频相同,且翻转次数不受限制时,我们至少能通过「逐个调整」将一数组变为另一数组(以当前需要调整的位置作为待翻转子数组的左端点,目标数值所在位置作为右端点)。
先翻转[i:j]再翻转[i:j+1]即可实现将j放到i位置,其他位置平移。
用这个方式可以将任意数字放到任意位置
var canBeEqual = function(target, arr) {
target.sort();
arr.sort();
const len = target.length;
for (let i = 0; i < len; ++i) {
if (target[i] != arr[i]) return false;
}
return true;
};
代码详解
先将两个数组进行排序,然后依次比较两个数组的元素是否相同。如果都相同则返回true,有一个不同就返回false。