原文链接: https://leetcode-cn.com/problems/make-two-arrays-equal-by-reversing-sub-arrays
英文原文
Given two integer arrays of equal length target
and arr
.
In one step, you can select any non-empty sub-array of arr
and reverse it. You are allowed to make any number of steps.
Return True if you can make arr
equal to target
, or False otherwise.
Example 1:
Input: target = [1,2,3,4], arr = [2,4,1,3] Output: true Explanation: You can follow the next steps to convert arr to target: 1- Reverse sub-array [2,4,1], arr becomes [1,4,2,3] 2- Reverse sub-array [4,2], arr becomes [1,2,4,3] 3- Reverse sub-array [4,3], arr becomes [1,2,3,4] There are multiple ways to convert arr to target, this is not the only way to do so.
Example 2:
Input: target = [7], arr = [7] Output: true Explanation: arr is equal to target without any reverses.
Example 3:
Input: target = [1,12], arr = [12,1] Output: true
Example 4:
Input: target = [3,7,9], arr = [3,7,11] Output: false Explanation: arr doesn't have value 9 and it can never be converted to target.
Example 5:
Input: target = [1,1,1,1,1], arr = [1,1,1,1,1] Output: true
Constraints:
target.length == arr.length
1 <= target.length <= 1000
1 <= target[i] <= 1000
1 <= arr[i] <= 1000
中文题目
给你两个长度相同的整数数组 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 = [1,12], arr = [12,1] 输出:true
示例 4:
输入:target = [3,7,9], arr = [3,7,11] 输出:false 解释:arr 没有数字 9 ,所以无论如何也无法变成 target 。
示例 5:
输入:target = [1,1,1,1,1], arr = [1,1,1,1,1] 输出:true
提示:
target.length == arr.length
1 <= target.length <= 1000
1 <= target[i] <= 1000
1 <= arr[i] <= 1000
通过代码
高赞题解
通过样例的启发,就是判断两个数组元素是否相同。
证明也很简单,需要知道冒泡排序的过程,如果不知道可以学习一下。
冒泡排序的所有操作都是不断交换相邻两个元素的过程,交换相邻两个元素的操作也是反转子数组的一种。
考虑数组target
,它一定可以通过冒泡排序变成递增(递减)的数组。假设我们记录下每一次的交换,记为操作序列A
。
考虑数组 arr
,它也一定可以通过冒泡排序变成递增(递减)的数组。
如果target
与arr
元素相同,那么最终冒泡排序结果也相同。将数组arr
进行冒泡排序,再进行操作序列A
的逆过程,就一定可以得到target
。
如果数组target
的元素与数组arr
的元素不同,显然无法通过arr
得到target
。
代码就很简单了,如下:
class Solution {
public:
bool canBeEqual(vector<int>& target, vector<int>& arr) {
vector<int> v(1001, 0);
for(int i = 0; i < target.size(); i++) {
v[target[i]]++;
v[arr[i]]--;
}
for(int i = 1; i <= 1000; i++) {
if(v[i] != 0)
return false;
}
return true;
}
};
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
15914 | 21425 | 74.3% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|