iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Mobile Development

30天用 Swift 解 LeetCode 問題系列 第 23

Day 23 - 724. Find Pivot Index - 解法與複雜度分析 - LeetCode in Swift

  • 分享至 

  • xImage
  •  

hero

基本資訊

資料結構與演算法

  • Prefix Sum

題意

給予一個整數陣列 nums ,請找出一個轉折點,並回傳轉折點的 index 。

轉折點:當左邊(不包含自己)元素的總和等於右邊(不包含自己)元素的總和,當前的自己稱為轉折點。

當找不到轉折的時候請回傳 -1

想法

如果要有效率地在走訪途中就能夠及時比較,就必須

  • 先計算整個陣列的總和 (O(n))
  • 再走訪一次,比較左邊和右邊的總和 (O(n))
    • 左邊:宣告一個變數邊走訪邊加總,就能夠知道總和了
    • 右邊:陣列總和 - 當前元素 - 左邊
  • 結束運算①:當左邊和右邊相等,就回傳當前的索引 (index)
  • 結束運算②:走訪完成都沒有相等的話,就回傳 -1

程式碼

class Solution {
    func pivotIndex(_ nums: [Int]) -> Int {
        let sum = nums.reduce(0) { $0 + $1 }
        var left = 0
        
        for (index, num) in nums.enumerated() {
            if left == sum - left - num { return index }
            left += num
        }
        
        return -1
    }
}

執行結果

  • Runtime: 109 ms (Beats 74.52%)
  • Memory: 14.5 MB (Beats 18.27%)

複雜度分析

令 n 為陣列的長度

Big O 說明
時間複雜度 O(n) 線性走訪兩次, O(2n) 調整後為 O(n)
空間複雜度 O(1) 只有用常數個多餘的變數 - 陣列總和和 left 總和

結語

以上,就是今天的 LeetCode in Swift ,

如果有什麼問題和回饋歡迎留言一起討論,今天就到這裡,明天見!


上一篇
Day 22 - 525. Contiguous Array - 解法與複雜度分析 - LeetCode in Swift
下一篇
Day 24 - 1480. Running Sum of 1d Array - 解法與複雜度分析 - LeetCode in Swift
系列文
30天用 Swift 解 LeetCode 問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言