[LeetCode][golang] 1. 两数之和

1,766 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

参加了一个面试,被问了两数之和的问题,一开始我还以为是要用什么复杂的算法和处理,自己还想搞什么排序啥的。

今天看了下力扣才发现,就是题库里的第一题。简单问题复杂化,可真坑。

题目描述:

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2:

输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]  

思路分析:

两层循环,第一层循环加数,第二层循环被加数,和等于目标值时返回结果。 效率也提高不了多少,最多是内层循环从外层的下标加1开始循环,然后找到下标时不执行完所有循环直接返回结果。

AC 代码:

使用个人喜欢的 go ,感觉代码真的好简洁!

package main

import "fmt"

func twoSum(nums []int, target int) []int {
   var index []int
   var l = len(nums)
   for i := 0; i < l; i++ {
      a := nums[i]
      for j := i + 1; j < l; j++ {
         if a+nums[j] == target {
            index = append(index, i)
            index = append(index, j)
            return index
         }
      }
   }

   return nil
}

func main() {
   nums := []int{2, 7, 11, 15}
   target := 25

   index := twoSum(nums, target)

   if index != nil {
      fmt.Println(index)
   } else {
      fmt.Println("未找到对应下标")
   }
}

总结:

面试时我是真想多了,当时回答是下面这样的。
先定义个结构体,结构体里定义两个属性,一个是值,一个是下标。
先循环一遍,把数组各元素转换为结构体的数组,然后再按照值进行排序。
然后从第一个元素的值(加数)开始循环,二分查找目标值减去的结果值。
找到后,再取出两个元素的下标。
现在想想,简直是脑洞开到了天际。