加载中...
1460-通过翻转子数组使两个数组相等(Make Two Arrays Equal by Reversing Sub-arrays)
发表于:2021-12-03 | 分类: 简单
字数统计: 928 | 阅读时长: 4分钟 | 阅读量:

原文链接: 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,它也一定可以通过冒泡排序变成递增(递减)的数组。
如果targetarr元素相同,那么最终冒泡排序结果也相同。将数组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%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1444-切披萨的方案数(Number of Ways of Cutting a Pizza)
下一篇:
1461-检查一个字符串是否包含所有长度为 K 的二进制子串(Check If a String Contains All Binary Codes of Size K)
本文目录
本文目录