- 作者: 負雪明燭
- id: fuxuemingzhu
- 個人博客:http://fuxuemingzhu.cn/
題目地址:https://leetcode-cn.com/problems/make-two-arrays-equal-by-reversing-sub-arrays/
題目描述
給你兩個長度相同的整數數組 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
題目大意
通過翻轉子數組,是否能讓 arr 變化爲 target。
解題方法
判斷排序後是否相等
這個題有很強的迷惑性。如果不看題目的難易程度是 Easy 的話,那麼確實不知道怎麼解決。
實際上,我們只需要把 target
和 arr
分別排序,然後判斷排序後的數組是否相等即可。爲什麼呢?
題目說了可以任意多次的交換 arr
中的子數組,如果把子數組的長度設置爲 2 ,即可以任意多次翻轉連續的兩個元素,是不是可以對 arr
完成冒泡排序呢?假設排序後的 arr
爲 sorted(arr)
。
同理,如果我也可以通過翻轉連續的兩個元素對 target
也冒泡排序,假設排序後的 target
爲 sorted(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)
統計字符出現次數
根據上面的分析,我們也可以判斷 arr
和 targtet
兩個數組中的字符出現次數是否相等。如果相等,那麼排序後一定也相等。
class Solution:
def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
return Counter(target) == Counter(arr)
歡迎關注負雪明燭的刷題博客,leetcode刷題800多,每道都講解了詳細寫法!
日期
2020 年 5 月 31 日 —— 轉眼 5 月過去了