力扣每日一题2022-08-24简单题:通过翻转子数组使两个数组相等

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


题目描述

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


思路

哈希表

如果arr长度为1,可以直接判断arr是否和target相同,因为无论如何翻转,都不会改变数组。
如果arr长度大于1,只需要满足arr和target的元素相同,arr就能通过若干次操作变为target。这主要是因为通过一次或两次翻转操作,必然可以交换arr数组中的任意两个元素的位置并且保持其他元素的位置不变。如果像交换两个相邻元素的位置,只需要翻转这两个元素组成的子数组即可;如果交换非相邻的两个元素,则翻转这两个元素及两个元素之间所有元素,之后在翻转两个元素之间的所有元素,即可实现翻转两个元素,其他元素位置不变。

Python实现
class Solution:
    def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
        return Counter(target) == Counter(arr)
Java实现
class Solution {
    public boolean canBeEqual(int[] target, int[] arr) {
        Map<Integer, Integer> counts1 = new HashMap<>();
        Map<Integer, Integer> counts2 = new HashMap<>();
        for (int num : target) {
            counts1.put(num, counts1.getOrDefault(num, 0)+1);
        }
        for (int num : arr) {
            counts2.put(num, counts2.getOrDefault(num, 0)+1);
        }
        for (Map.Entry<Integer, Integer> entry : counts1.entrySet()) {
            int key = entry.getKey(), value = entry.getValue();
            if (!counts2.containsKey(key) || counts2.get(key) != value) {
                return false;
            }
        }
        return true;
    }
}
C++实现
class Solution {
public:
    bool canBeEqual(vector<int>& target, vector<int>& arr) {
        unordered_map<int, int> counts1, counts2;
        for (int num : target) {
            counts1[num]++;
        }
        for (int num : arr) {
            counts2[num]++;
        }
        for (auto &[key, value] : counts1) {
            if (!counts2.count(key) || counts2[key] != value) {
                return false;
            }
        }
        return true;
    }
};

排序

思路与哈希表类似,只不过哈希表是对数组进行统计,排序是对数组进行从大到小排序后看看两个数组是否相等,如果相等,就说明可以通过翻转得到。代码就不再实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值