两数之和

题目

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题目地址:https://leetcode-cn.com/problems/two-sum

一般写法

运行时间为60毫秒,战胜了35%的一般写法:

func twoSum(nums []int, target int) []int {
    
    // 数组长度需要用两次及以上的,就用变量保存下来,提高效率
    num := len(nums)
    
    for i := 0; i < num; i++ {
        for j := i + 1; j < num; j++ {
            if nums[i] + nums[j] == target {
                return []int{i, j}
            }
        }
    }
    
    return nil
}

高手解答

运行时间为4毫秒,战胜了100%的高手写法:

func twoSum(nums []int, target int) []int {
    count := len(nums)
    tmpNums := make([]int, count)
    // 复制数字,是为了排序后保留序号
    copy(tmpNums[:], nums)
    res := []int{}
    i := 0
    j := count - 1
    sort.Ints(nums)  // 从小到大,排序

    // 第一遍遍历,找到目标数字
    for i < j {
        sum := nums[i] + nums[j]
        if sum > target {
            j--
            continue
        } else if sum < target {
            i++
            continue
        } else {
            break
        }
    }
    // 第二遍遍历,找到目标数字对应的序号
    if i < j {
        for k, v := range tmpNums {
            if nums[i] == v || nums[j] == v {
                res = append(res, k)
            }
        }
    }

    return res
}

你可能感兴趣的:(两数之和)