算法學習之路----兩數之和

前言

工作一段時間之後,最大的感覺就是算法好像沒什麼用,確實不會算法也能勝任平常的工作,但是總覺得缺了點什麼,所以最近抽空複習了以前刷的 Leetcode,希望在這裏找到一羣志同道合的人:bowtie:。

兩數之和(Two Sum)

這是 LeetCode 的第一題,總體來說是比較簡單的,題幹如下:

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那兩個整數,並返回他們的數組下標。
示例:
    給定 nums = [2, 7, 11, 15],target = 9
    因爲 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

簡單來說就是給定一個數組,讓你找到和爲 target 的兩個元素的索引。

解題思路

主要有 兩種解題思路

  • 暴力解法:兩層循環,外部循環的當前值與target的差值爲內層循環需要定位的值。時間複雜度O(n^2),空間複雜度O(1)。
  • 優雅解法:一層循環,引入map,循環的當前值與target的差值在map中查找,如果不存在則將當前值作爲鍵放入map,值的索引作爲map的值,存在就返回。時間複雜度O(n),空間複雜度O(n)。相比於暴力解法其實就是空間換時間。

代碼實現

暴力解法GO實現:

/*暴力解法
思路:
    兩層循環,外部循環的當前值與target的差值爲內層循環需要定位的值
*/
func twoSumForce(nums []int, target int) (result []int) {
    length := len(nums)
    if length <= 0 {
        return
    }
    for i := 0; i < length; i++ {
        for j := i + 1; j < length; j++ {
            // 找到了就直接返回
            if nums[j] + nums[i] == target {
                return []int{i,j}
            }
        }
    }
    return
}

優雅解法GO實現:

/*優雅解法
思路:
    一層循環,引入map,循環的當前值與target的差值在map中查找,如果不存在則將當前值作爲鍵放入map,值的索引作爲map的值。
*/
func twoSumElegant(nums []int, target int) (result []int) {
    if len(nums) <= 0 {
        return
    }
    var m = make(map[int]int)
    for index, value := range nums {
        if v, ok := m[target-value]; !ok {
            // 將當前值和索引放入map中
            m[value] = index
        } else {
            return []int{index,v}
        }
    }
    return
}

總結

每天進步一點點,加油!
完整代碼:https://github.com/wx-satellite/go-leetcode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章