携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
刷题的日常-2022年8月24日
一天一题,保持脑子清爽
通过翻转子数组使两个数组相等
来自leetcode的 1460 题,题意如下:
给你两个长度相同的整数数组target和arr。每一步中,你可以选择arr的任意 非空子数组并将它翻转。你可以执行此过程任意次。
如果你能让 arr变得与 target相同,返回 True;否则,返回 False 。
示例如下:
输入: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 的方法。
理解题意
我们可以从题意中提取的条件如下:
- 给定两个数组
- 数组里的数据是无序的
- 要求我们反转子数组
- 如果通过任意次翻转两个数组能够匹配上,返回true,否则返回false
做题思路
其实不需要进行翻转就可以知道,如果数组里面的数是完全相同的,那么一定可以翻转匹配,所以我们可以用贪心的思想解题:
- 判断两个数组长度是否一样,不一样当然无法匹配,直接返回false即可
- 将两个数组进行排序
- 拍完序之后,两数组的内容完全相同的话那么每个元素都应该是一样的
- 如果出现不一致的元素,返回false即可 另外一种思路是通过Hash表去保存相同元素出现的次数,如果每个元素出现的次数相同,那么也是可以通过翻转子数组最总达到一致的状态,这里就不提供代码了、
代码实现
代码实现如下:因为要进行排序,所以时间复杂度为O(arr.length)
public class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
if (target.length != arr.length) {
return false;
}
Arrays.sort(target);
Arrays.sort(arr);
for (int i = 0, len = target.length; i < len; i++) {
if (target[i] != arr[i]) {
return false;
}
}
return true;
}
}