LeetCode算法 每日一题 1: Two Sum
Leetcode是许多欧美IT公司招聘工程师会先用的算法题库,虽然不尽是原题,但是基本也是小改动后的类似题。学习算法最重要的是不断积累,我们从今天开始 每天一道算法题,包括:
算法解题总结:
- 问题分析
- Trick思考,
- Corner Case测试,
- 时间复杂度/空间复杂度分析,
- 优化和总结
LeetCode Q1: Two Sum
问题描述:
给你一个整数数组int[],和一个目标值target,数组中肯定存在一个唯一解能够使得两个不同下标的元素x1,x2的算术和等于target. 相同的元素只能使用一次,不能重复使用。
问题分析:
-1.题目没说数组是有序的,虽然例子给的恰好是有序的
-2.要求的是元素下标,不是元素本身,所以直接排序数组的话,元素下标会乱掉
-3.数组中元素可能存在重复值
-4.O(n^2)肯定是可以的,但是有没有更优的解呢?
解决方案:
Solution 1: Brute Force 双循环 / 时间复杂度=O(n^2) 不需要额外的空间
使用两个指针,i和j,固定i,移动j往右扫描直到找到结果,代码如下:
可以看到最简单的双循环基本是最慢的-70ms,提交后处于后10%的分布。那有没有更快的方法呢?答案是solution 2
Solution 2: 使用HashMap存储index,从而空间换时间 / 时间复杂度=O(n) 空间复杂度=O(n)
先用HashMap遍历一边数组O(n),保存下来每个元素的值和对应的下标index; 然后重新用另外一个循环遍历所有的值o(n),当前值就是x, 那需要找的另外一个值就是target-x. 理乱上我们只需要遍历数组元素的一半就可以结束了。此处需要注意,因为可能存在多个相同的元素,所以我们哈希表里面存储index要使用list.
使用哈希表后,运行速度得到了明显提升20ms,速度提升了3倍,基本上达到了O(n)的最优解。类似的问题还会有 Three Sum 等等,后序持续更新中!
总结:
当遇到问题是,如果没有头绪的情况下,可以先尝试用暴力破解的方法,然后慢慢优化。Do is better than perfect,永远先搞一个work的方案出来,别老是想着一步到位,直接最优解。
关注,转发和收藏“松鼠游学”,每日更新 "Leetcode" 算法相关的面试题和解题方案并附上源码,欢迎有兴趣的小伙伴私信私聊!
请先 后发表评论~