开启掘金成长之旅!这是我参与「掘金日新计划 · 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.length1 <= target.length <= 10001 <= target[i] <= 10001 <= 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一一对应呢,对两个数组都进行排序。 - 排序改变的是值的位置顺序,不改变值的大小和个数,排序完再对数组进行遍历,如果是
target和arr能通过翻转后相等,那么排序后两个数组的每个下标的值都应该是相等的 - 如果有一项不相等,那么返回
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一定是有值的。
- 如果要使得
结果:
- 排序比较:
- 逐一排除: