算法題解:兩數之和

題目

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

題目來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/two-sum

解答

package main

import "fmt"

func main() {
	arr := []int{3, 2, 6, 11, 9, 16}

	//fmt.Println(twoSum2(arr, 15))  // [2,4]
	//fmt.Println(twoSum(arr, 18)) // [1,5]
	//fmt.Println(twoSum(arr, 13)) // [1,3]
	//fmt.Println(twoSum(arr, 17)) // [2,3]
	//fmt.Println(twoSum(arr, 27)) // [3,5]
	//fmt.Println(twoSum(arr, 50)) // []

	fmt.Println(twoSum2(arr, 15)) // [2,4]
	fmt.Println(twoSum2(arr, 18)) // [1,5]
	fmt.Println(twoSum2(arr, 13)) // [1,3]
	fmt.Println(twoSum2(arr, 17)) // [2,3]
	fmt.Println(twoSum2(arr, 27)) // [3,5]
	fmt.Println(twoSum2(arr, 50)) // []
}

// 姿勢1
func twoSum(nums []int, target int) []int {
	count := len(nums)
	var resArr []int
	for i := 0; i < count; i++ {
		for j := i + 1; j < count; j++ {

			if nums[i]+nums[j] == target {
				resArr = append(resArr, i, j)
				return resArr[:]
			}
		}
	}

	return resArr[:]
}

// 姿勢2
func twoSum2(nums []int, target int) []int {
	count := len(nums)
	resMap := make(map[int]int)
	var resArr []int
	for i := 0; i < count; i++ {
		num2 := target - nums[i]
		if _, ok := resMap[num2]; ok {
			resArr = append(resArr, resMap[num2], i)
			return resArr
		}

		resMap[nums[i]] = i
	}

	return resArr[:]
}

 

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