LeetCode算法 每日一题 1: Two Sum

Leetcode是许多欧美IT公司招聘工程师会先用的算法题库,虽然不尽是原题,但是基本也是小改动后的类似题。学习算法最重要的是不断积累,我们从今天开始 每天一道算法题,包括:

算法解题总结:

  1. 问题分析
  2. Trick思考,
  3. Corner Case测试,
  4. 时间复杂度/空间复杂度分析,
  5. 优化和总结

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" 算法相关的面试题和解题方案并附上源码,欢迎有兴趣的小伙伴私信私聊!

@极限尤可突破,至臻亦不可止!

举报
评论 0