Advanture 1 - leetcode 1 - Two Sum
leetcode
解题思路总结:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
链接:示例:
1 | 给定 nums = [2, 7, 11, 15], target = 9 |
解题思路
对于这样的题目,最容易想到的是brute-force
暴力解法, 直接两重循环进行迭代.
1 | class Solution { |
复杂度分析(Complexity Analysising):
- 时间复杂度(Time complexity):
- 空间复杂度(Space complexity):
暴力解法虽然可行,但是时间复杂度为, 考虑进行优化,首先想到是可以以空间换时间:
如果能够把给定数组的数,用某种数据结构将每个数的数值以及对应的索引(index)保存起来,则只需要用一次遍历查找target - nums[i]
是否存在于该数据结构中,且非nums[i]
即可。
1 | class Solution { |
复杂度分析(Complexity Analysising):
- 时间复杂度(Time complexity):
- 空间复杂度(Space complexity):
年轻的我,本以为上面的这种解法已经是最优的了,但是看完讨论区之后,才焕然大悟,它还可以进行优化:
仔细看的话,上面的HashMap
算法访问了nums
数组两遍,而接下来,从leetcode
上学习到的优化方法就是将nums
数组的访问从两遍降到一遍.
1 | class Solution { |
由于map
中保存的肯定是索引i
之前的数,因此不需要判断map.get(remain) != i
.
复杂度分析(Complexity Analysising):
- 时间复杂度(Time complexity): O(n)
- 空间复杂度(Space complexity): O(n)
总结
对于能够快速使用brute-force
暴力解法解决的问题,考虑优化时,首先考虑能够减少循环的嵌套,其次是考虑减少数组的访问次数、元素比较次数、元素交换次数等。