应该如何刷 LeetCode?

LeetCode

作笔记

对于遇到的每一个题目,过后都作上标记:普通题目,难题、好题。此外,每一个题目都分为如下几个步骤作好详细的笔记:面试

1. 原题目

2. 本身的第一遍解法

3. 网上好的解法

4. 本身能够改进的地方

5. 进一步精简优化本身的代码直至代码简无可简这是很是关键的一步,到达这一步,才会发现得到能力的提高远远要超过简单地把题目解出来

6. 得到的思考(或者学习到的地方,能够是算法、数据结构或者Java的特性—例如Stream等等)

每个题目都通过至少一遍这样的迭代。这样几遍下来,我对于每一个题目都有了更加深入的理解,大部分的题目我都有自信可以写出最优解甚至代码都是最优化的(至少比论坛回复里面的最高票答案还要精简)。算法

 

举个例子,两数之和问题。编程

我最先的解法是暴力搜索。当时的代码(Java)是这样的:数据结构

class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i+1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[]{i, j}; } } } throw new IllegalArgumentException("No two sum solution"); } }

 

这个解法不只复杂度高,并且代码冗长繁琐。学习

后来看了网上高票答案的解法,知道了用hashmap来作,因而写出了优化的代码(Java):优化

class Solution { public int[] twoSum(int[] nums, int target) { HashMap<Integer,Integer> map = new HashMap<>(); int[] res = new int[2]; for (int i = 0; i < nums.length; i++) { int dif = target - nums[i]; if (map.get(dif) != null) { res[0] = map.get(dif); res[1] = i; return res; } map.put(nums[i],i); } return res; } }

 

再后来,对代码进行了一些细节的简化:spa

public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap(); for (int i = 0; i < nums.length; ++i) { if (map.containsKey(target- nums[i])) { return new int[]{map.get(target- nums[i]), i}; } map.put(nums[i], i); } return new int[]{-1, -1}; } }

 

至此,代码几乎达到最精简状态。(中间有略去几回迭代)总之,不断地学习别人的代码,改进本身的代码,不断地锤炼本身的代码,直至算法最优化,代码最简洁!code

潜移默化中,不只对题目解法有了更深入的理解(什么是最优解),并且也知道如何用最简洁的代码实现这个最优解。blog

 

再举个极端的例子吧,179. 最大数,这个题目我最后精简成的代码以下:get

public String largestNumber(int[] nums) {
 return Arrays.stream(nums)
 .mapToObj(String::valueOf)
 .sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
 .reduce((s1, s2) -> s1.equals("0") ? s2 : s1 + s2).get();
 }

 

我本人不是算法高手,算是勤能补拙类型。这样长期坚持下来,慢慢地感受本身编程能力提高了不少。不只面试的时候驾轻就熟,并且在工做中提交code review的时候,每每有自信说本身的代码是简单,干净与优雅的。

相关文章
相关标签/搜索