侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 22 条评论

目 录CONTENT

文章目录

【计数】通过翻转子数组使两个数组相等

GabrielxD
2022-08-24 / 0 评论 / 0 点赞 / 218 阅读 / 611 字
温馨提示:
本文最后更新于 2022-09-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1460. 通过翻转子数组使两个数组相等


给你两个长度相同的整数数组 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

解题

方法一:计数

思路

可以选择 arr 中的任意非空子数组并将它翻转,也就是说所有元素的位置都可以随意变更(类似冒泡排序),那么只要两个数组中所有数字相同就能让两个数组变得相同。而两个数组的长度是相同的,也就是说过两数组如果不同则一定会在一个数组中出现不同的数字,或者相同数字的数量不同。那么维护一个计数哈希表,在 target 中把数字对应计数加一,在 arr 中把数字对应计数减一,其中如果某个数字的计数小于 0,那么两个数组一定不同。1 <= target[i], arr[i] <= 1000 所以用数组代替哈希表做计数。

代码

class Solution {
public:
    bool canBeEqual(vector<int>& target, vector<int>& arr) {
        int cnts[1001] = {0};
        for (const int& num : target) ++cnts[num];
        for (const int& num : arr) {
            if (--cnts[num] < 0) return false;
        }
        return true;
    }
};
class Solution {
    public boolean canBeEqual(int[] target, int[] arr) {
        int[] cnts = new int[1001];
        for (int num : target) ++cnts[num];
        for (int num : arr) {
            if (--cnts[num] < 0) return false;
        }
        return true;
    }
}
0

评论区