Graph 新題型 Min Swaps to Sort Array

2021-02-19 一個小老虎

我一開始拿到題目的時候一點思路也沒有。後來經人提示才發現實際上這是一道披著 sort 外衣的 graph 題目。

最近我的小夥伴問了一道題非常有趣。題目不難,但是我之前從來沒有遇到過,所以好好研究了一下。現在分享給大家,有更好的解法的同學可以指點我,如果沒見過這題的我們可以一起探討。

這題最開始是在 Google 的 phone screen 中被問到的。網上也有不少討論。

題目

原題如下:

Given an array return an integer indicating the minimum number of swap operations required to sort the array into ascending order.
Input: [1, 3, 4, 2]Output: 2Explanation: [1, 3, 4, 2] -> [1, 2, 4, 3] -> [1, 2, 3, 4]

例如 input 是 [1, 3, 4, 2]。第一次選 3 那麼就是把 3 和從左到右第 index=2 的數也就是 2 互換。得到 [1, 2, 4, 3]。第二次選 4 那麼就是4 和從左到右第 index=3 個數也就是 3 互換。得到[1, 2, 3, 4] 是上升序列。所以 output 是 2(最少換了2次)。

我一開始拿到題目的時候一點思路也沒有。後來經人提示才發現實際上這是一道披著 sort 外衣的 graph 題目。

我們來看 input [1, 3, 4, 2]

① 先試著排一下序看看會發生什麼。

排序後的 index 0 3 1 2

已經排序後的數組 [1, 2, 3, 4]

② 找規律發現:

num 1: 0 → 0

num 3: 1 → 2

num 4: 2 → 3

num 2: 3 → 1

總結髮現實際上這就變成了一個有 4 個 vertex 的 graph。

那麼接下來怎麼推進呢?

不慌,我們先來複習一下 graph 的定義。

Graph 定義

對於 graph G = (V, E) 主要包括兩點:

vertex(V):頂點

edge(E):邊

一邊有單向 graph 和雙向 graph 之分。

現在回到我們的題目,雖然看上去互換(swap)非常迷惑,感覺非常像雙向 graph,但實際上這是一個單項 graph 就可以解決的題目。

解題思路

所以我的思路如下,用標準的 DFS 來遍歷這個 graph 即可。

①首先建立 graph (index, num)

[(0, 1), (1, 3), (2, 4), (3, 2)]

② 根據 num 排序

[(0, 1), (3, 2), (1, 3), (2, 4)]

③ for loop 這個數組,遇到當前 i 和 index 不一致的就 DFS 一直往下找。每遍歷新的一個 vertex 就記錄一次 swaps。總的 swaps 應該是遍歷的 edge,所以應該是 vertex 的遍歷數 - 1。這個環節的技巧是利用 graph 反向推導。即從 sorted input 還原到最開始 original position 需要多少 swap。因為 original order 是已知條件。

// pseudo codevisited = {};
for i, [0 -> 4): if(sortedInput[i][0] == i || visited[i]){ // skip current index continue; } vertex = i; swaps = 0; while(!visited[vertex]){ visited[vertex] = true; // DFS 一直遍歷到底 vertex = sortedInput[vertex][0]; swaps += 1; } if(swaps > 0){ total += swaps - 1; }

我還總結了很多類似的 LeetCode 解題技巧,可以公眾號回復「刷題「獲取。

下面的手稿是 input = [2, 4, 5, 1, 3] 的演算過程。

總結

首先是複雜度分析。

Time Complexity: O(NlogN) N 表示遍歷 N 個節點;logN 表示排序

Space Complexity: O(N) 需要保存當前已經訪問過的 vertex

遇到類似的題如果正面推不出來,可以考慮反面推。先把 input 排個序。兩個解題要點:1)先把 graph 建起來。2)在這個基礎上倒推回原來的 original 數組 list。

原始碼就不貼出來了,如果大家有需要或者還沒看明白也可以聯繫我。同時歡迎指出錯誤,我們一起進步。

Google | Phone Screen | Min Swaps to Sort Array

如果你對其他的算法學習也感興趣,可以公眾號回復」算法「深入了解。

自我提升 | 編程規劃 | 美國生活

你若喜歡,為小老虎點個在看哦 

相關焦點

  • Sort題型總結
    Sort題型總結1.Selection Sort 選擇排序Given an array of integers, sort the elements in the array in ascending order.
  • Javascript中 Array.sort 原理學習
    其實在代碼中一個sort()就可以解決,並且時間複雜度和空間複雜度相對都不會過高。其實sort()不光可以對數組進行排序, 基本數據類型的數組都可以, 並且可以實現對對象數組的排序。原理為什麼sort()都可以排序呢? 而且時間和空間複雜度都還比較優良, 有沒有人想過sort()裡面是怎麼實現的呢?
  • Sort an Array 數組排序
    Given an array of integers nums, sort the array in ascending order.
  • LeetCode | 實現排序比較函數 | Relative Sort Array
    https://leetcode.com/problems/relative-sort-array/
  • JavaScript Array對象
    array.reverse()shift()刪除數組的第一個元素。array.shift()slice()選取數組的一部分,並返回一個新數組。array.slice(start, end)some()檢測數組元素中是否有元素符合指定條件。array.some(function(currentValue,index,arr),thisValue)sort()對數組的元素進行排序。
  • Excel – 多條件排序就用 sortby 函數
    O365 這次出了兩個排序函數,除了前段時間給大家講解過的 sort 以外,還有一個 sortby 函數。sortby 函數也是用於排序,功能跟 sort 類似,主要區別在於:有關 sort 函數的詳解,請參閱 Excel – 告別繁瑣的菜單操作
  • PHP實現耐心排序(patience sort)算法
    耐心排序(patience sort)是一種排序算法,靈感來源於紙牌遊戲patience,並以此命名。該算法的一個變體可以有效地計算給定數組中最長遞增子序列的長度。該算法的名字來源於一個簡化版的patience紙牌遊戲。這個遊戲以一副洗牌開始。
  • JavaScript函數補完:sort()排序
    JavaScript實現多維數組、對象數組排序,其實用的就是原生的sort()方法,用於對數組的元素進行排序。
  • NDRC: Market forces will shape debt-to-equity swaps
    Official rules out coercion but says troubled firms will be persuaded to consider the alternative option China will stick to market-based principles while promoting debt-to-equity swaps
  • Python中的Timsort算法,Timsort算法的優缺點,中級python技術點
    Python中的Timsort算法Timsort算法被認為是一種混合排序算法,因為它採用了插入排序和合併排序的兩種方法的最佳組合。Timsort對於Python社區來說非常重要,因為它是由Tim Peters在2002年創建的,用於作為Python語言的標準排序算法。Timsort的主要特點是它利用了存在於大多數真實數據集中的已經排序的元素。
  • js中的Array對象屬性和方法整理
    valueOf()返回數組對象的原始值 1.4 concat()語法: array.concat(value, ...)其中value, ... 要添加到array中的值,可以是任意多個。返回值: 一個新數組,是把指定的所有參數添加到array中構成的。
  • JavaScript中原生Array數組方法詳解
    成員的後部,然後返回一個新副本,原副本不變。正在使用,.filter(fn(value,index,array),thisArgument)。value})7.sort(compareFunction)排序方法對數組成員進行排序,默認是按照字典順序排序。排序後,原數組將被改變。
  • Debt, equity swaps to help tackle risks, boost growth
    Commercial banks urged to set up financial asset investment units China will accelerate the debt-for-equity swaps of qualified companies to reduce high corporate leverage