雜湊查詢 兩數之和

pardon110發表於2020-10-16

如同for迴圈增量在不同的位置影響迴圈體邊控,雜湊讀寫亦如是

給出一個整數陣列,請在陣列中找出兩個加起來等於目標值的數,
你給出的函式twoSum 需要返回這兩個數字的下標(index1,index2),需要滿足 index1 小於index2.。

注意:下標是從1開始的 假設給出的陣列中只存在唯一解
例如:
給出的陣列為 {20, 70, 110, 150},目標值為90
輸出 index1=1, index2=2

分析

  • 暴力破解雙層迴圈
  • 確保使用的雜湊,在查詢之後收錄當前索引位

雜湊實現

一次迴圈解決雜湊讀寫,遞增索引查詢

func twoSum( numbers []int ,  target int ) []int {
    m := make(map[int]int,0)
    for i,v := range numbers {
        if idx, ok := m[target-v];ok{
            return []int{idx,i+1}
        }
        m[v]=i+1
    }
    return nil
}

暴力破解

func twoSum( numbers []int ,  target int ) []int {
    for i:=0;i<len(numbers);i++ {
        for j:=i+1;j<len(numbers);j++{
            if numbers[i] + numbers[j] == target {
                return []int{i+1,j+1}
            }
        }
    }
    return nil
}

數對和

找出陣列中兩數之和為指定值的所有整數對。一個數只能屬於一個數對

輸入: nums = [5,6,5], target = 11
輸出: [[5,6]]

雜湊查詢成功,當前迴圈變數數不入雜湊,對應雜湊計數減記

func pairSums(nums []int, target int) [][]int {
    rs := [][]int{}
    m := make(map[int]int, 0)
    for _,v := range nums{
        if cnt,ok := m[target-v];ok && cnt > 0{
            rs = append(rs, []int{target-v, v})
            m[target-v]--
        }else{
            m[v]++
        }
    }
    return rs
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章