Day18# Leetcode TwoSum

接下来的 12 天,会用每天刷 leetcode 练习的方式来练习 Go
那麽话不多说,我们就进入正题吧 ─=≡Σ(((っ゚∀゚)っ!

今天要刷的题目是 Leetcode Easy -- twoSum!(登灯)
先来看看题目:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].

要找出阵列内哪两个元素相加起来会是 target 的值,并且用阵列的方式印出这两个元素的 index。

一开始以会动就好的麻瓜心态,来个两次 for 回圈:

func twoSum(nums []int, target int) []int {
	for i, num := range nums {
		for i2, num2 := range nums {
			if i != i2 && num+num2 == target {
				return []int{i, i2}
			}
		}
	}
	return nil
}

但发现 runtime 跑了 56ms 似乎时间有点长...?

竟然只比 7% 的人快XD

稍微参考一下其他人的做法,原来可以透过把 value 及 index 以 map 的方式记录起来,再以回圈的方式确认 target 减掉阵列的元素後的值,是否有包含在 map 内:

func twoSum(nums []int, target int) []int {
	m := make(map[int]int)
	for i, n := range nums {
		idx, ok := m[target-n]
		if ok {
			return []int{idx, i}
		}
		m[n] = i
	}
	return nil
}

嘿,runtime 进步到 4ms 了!
而且使用 map 的方式,就不需要去过滤掉同样的值是否有被重复使用的问题。

其实开始写 Leetcode 才发现我根本对所有的文法都没有很熟悉,例如 idx, ok := m[target-n]ok 会去得到 m map 内到底有没有这个 key 的存在。

结尾

第一天的 leetcode 练习就到这边结束,有任何问题都欢迎与我告知 :)
本篇文章同步发布於我的部落格


<<:  不只懂 Vue 语法:试解释如何使用导航守卫?

>>:  Day 18 To Do List - 加入逻辑 1

第28天 - 文件审核系统(6)_审核端2

今天来做审核端去审核客户端的档案(列印的程序码都有点长,所以只把比较不一样的程序码给列出来) 根据昨...

[Day7] Flutter - 堆叠布局 ( Stack、Positioned )

前言 Hi, 我是鱼板伯爵今天要教大家 Stack(堆叠) 和 Positioned(位子),Sta...

Day 21:「爸爸说,家里要重新装潢了」- 关於样式的属性绑定讲解

兔女鹅: 「爸爸,兔兔昨天讲的好难」 「有一大堆东西要记起来,要学不动了 QQ」 兔跋: 「一定是...

Day 15 AWS云端实作起手式第五弹 建立流量负载分流Elastic Load Balancer (ELB)

在建置ELB前,我们先多做一个步骤去完成昨天URL重写的步骤。 步骤 10 更改S3的bucket ...

状态流程图与有限状态机

状态图 (State Machine) ,是类似於本文章要介绍的主轴: 有限状态机 (Finite-...