前言
工作一段時間之後,最大的感覺就是演算法好像沒什麼用,確實不會演算法也能勝任平常的工作,但是總覺得缺了點什麼,所以最近抽空複習了以前刷的 Leetcode,希望在這裡找到一群志同道合的人。
兩數之和(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-leetcod...
本作品採用《CC 協議》,轉載必須註明作者和本文連結