【牛客刷題】BM50 兩數之和

本題的鏈接:BM50 兩數之和

最初拿到這個題目首先想到的就是兩個指針,然後向後遍歷,於是寫出來的代碼也簡明易懂:

package main

/**
 *
 * @param numbers int整型一維數組
 * @param target int整型
 * @return int整型一維數組
 */
func twoSum(numbers []int, target int) []int {
	// write code here
	for i := 0; i < len(numbers)-1; i++ {
		for j := i + 1; j < len(numbers); j++ {
			if numbers[i]+numbers[j] == target {
				return []int{i + 1, j + 1}
			}
		}
	}
	return []int{}
}

然而很不幸的是這個解法超時了。如果數組特別大,那麼這個解法顯然是不佔優勢的,時間複雜度明顯是O(n^2),而題目要求的時間複雜度是O(nlogn)。此時,如果引入一個map,則可以將對數組的遍歷降低成一趟,從而提升時間效率。

package main

/**
 *
 * @param numbers int整型一維數組
 * @param target int整型
 * @return int整型一維數組
 */
func twoSum(numbers []int, target int) []int {
	// write code here
	var m = make(map[int]int)

	for i := 0; i < len(numbers); i++ {
		v, ok := m[target-numbers[i]]
		if ok {
			return []int{v + 1, i + 1}
		} else {
			m[numbers[i]] = i
		}
	}
	return []int{}
}

這樣一來,整個用例的測試時間不過62ms。時間複雜度也降低到了O(n)

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