【LeetCode】5408. 通過翻轉子數組使兩個數組相等 Make Two Arrays Equal by Reversing Sub-arrays (Python)


題目地址:https://leetcode-cn.com/problems/make-two-arrays-equal-by-reversing-sub-arrays/

題目描述

給你兩個長度相同的整數數組 targetarr

每一步中,你可以選擇 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

提示:

  1. target.length == arr.length
  2. 1 <= target.length <= 1000
  3. 1 <= target[i] <= 1000
  4. 1 <= arr[i] <= 1000

題目大意

通過翻轉子數組,是否能讓 arr 變化爲 target。

解題方法

判斷排序後是否相等

這個題有很強的迷惑性。如果不看題目的難易程度是 Easy 的話,那麼確實不知道怎麼解決。

實際上,我們只需要把 targetarr 分別排序,然後判斷排序後的數組是否相等即可。爲什麼呢?

題目說了可以任意多次的交換 arr 中的子數組,如果把子數組的長度設置爲 2 ,即可以任意多次翻轉連續的兩個元素,是不是可以對 arr 完成冒泡排序呢?假設排序後的 arrsorted(arr)

同理,如果我也可以通過翻轉連續的兩個元素對 target 也冒泡排序,假設排序後的 targetsorted(target)

如果sorted(arr) == sorted(target) ,我們把sorted(arr)按照 target翻轉得到sorted(target)的操作步驟 反過來操作一遍就可以還原得到target

因此只要兩個數組如果排序後相等,那麼arr 可以通過翻轉轉化成 target

即操作步驟爲:

arr ==sort==> sorted(arr) == sorted(target) ==revert-sort==> target

Python 代碼如下:

class Solution:
    def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
        return sorted(target) == sorted(arr)

統計字符出現次數

根據上面的分析,我們也可以判斷 arrtargtet 兩個數組中的字符出現次數是否相等。如果相等,那麼排序後一定也相等。

class Solution:
    def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
        return Counter(target) == Counter(arr)

歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!

日期

2020 年 5 月 31 日 —— 轉眼 5 月過去了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章