1. 程式人生 > 實用技巧 >leetcode之283移動零Golang

leetcode之283移動零Golang

解析

我覺得我們需要考慮兩種情況:

  • 陣列中不存在重複元素

  • 陣列中存在重複元素

當陣列中存在重複元素,並且target剛好是這兩個元素的和,那麼我們的返回結果應該是兩個相同元素的下標,甚至如果這樣相同的元素有很多個,那麼我只需要返回前兩個相同的元素就可以了。

本題使用雜湊來實現,定義雜湊為map[int][]int ,鍵為陣列中元素的值,值為他們的下標,因為相同的元素可能會有多個,所以使用一個數組來儲存他們的下標

演算法

  • 遍歷陣列,將陣列元素的值作為map的鍵,將元素的下標存入值中(注意,值是一個[]int的陣列)

  • 第二次遍歷陣列,遍歷到的元素的值為value

    • 如果value==target-value

      ,說明了可以由兩個相同的元素相加得到這個target,那麼就看map值的那個陣列是否長度大於等於2,如果是就直接返回這個陣列的前兩個元素

    • 如果value!=target-value,說明了兩個相同的value不能得到這個target,就只需要map中鍵target-value對應的值的陣列長度大於等於1就可以了,然後返回當前遍歷的下標和map中陣列的第一個值就可以了

程式碼

func twoSum(nums []int, target int) []int {
    numsMap := make(map[int][]int)
    for index, value := range nums {
        numsMap[value] = append(numsMap[value], index)
    }
    for index, value := range nums {
        // 兩個元素相等的情況下,陣列nums中必須要有兩個元素才行
        if value*2 == target {
            if len(numsMap[value]) > 1 {
                return numsMap[value][:2]
            }
        } else {
            // 連個元素不相等
            if len(numsMap[target-value]) > 0 {
                return append(numsMap[target-value], index)
            }
        }
​
    }
    return []int{}
}