关于这段时间刷算法的总结
- 2019 年 12 月 15 日
- 筆記
11月份,也就是上个月,在leetCode上大概AC了100多道题吧,之前有刷几个是按默认顺序来刷的,不得不说如果有小伙伴和我一样没有什么数据结构基础及算法基本的常识,最好不要按顺序刷,遇到一些Medium和Hard心态真的容易崩,所以这里我主要是按难度来刷的,所以这个100多道有80来道是Easy的
(大佬请绕路),自从换了刷题方式之后,我感觉自信慢慢的提升了不少,当然之前在论坛有些大佬建议按Tag刷,我这里不推荐新手这么搞,如果真的想按Tag刷建议从Array、String等这些基础的入手。
下面给出了一些我AC过的题。



斐波那契数和爬楼梯这些题应该是最简单的dp,不要用迭代,栈很容易就满了,一般涉及到树的最大深度,层次遍历,对称二叉树等用递归特别好用。
// 树的最大深度 public int maxDepth(TreeNode root) { if(null == root) return 0; return 1 + Math.max(maxDepth(root.left), maxDepth(root.right)); }
// 对称二叉树 public boolean isSymmetric(TreeNode root) { return isMirror(root, root); } public boolean isMirror(TreeNode t1, TreeNode t2) { // 对称的条件 if (t1 == null && t2 == null) return true; if (t1 == null || t2 == null) return false; // 递归 return (t1.val == t2.val) && isMirror(t1.right, t2.left) && isMirror(t1.left, t2.right); }
还有一类用快慢双指针:判断链表是否有环
public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; // 慢指针 ListNode slow = head; // 快指针 ListNode fast = head; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; // 当快慢指针相同时,则说明是在圆环里面 if (slow == fast) { return true; } } return false; }
相交链表巧妙解题
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) { return null; } ListNode a = headA; ListNode b = headB; while(a!=b) { // a遍历完遍历b a = a==null?headB:a.next; // b遍历完遍历a b = b==null?headA:b.next; } return a; }
还有通过二进制位来解题
// 非空数组 一个数只出现过一次 其他数都出现过俩次 public static int singleNumber(int[] nums) { 2 int num = 0; 3 for (int i = 0; i < nums.length; i++) { // 相同的数异或为0 4 num = num ^ nums[i]; 5 } 6 return num; 7 }
也有通过贪心的如切绳子、最长回文子串的中心扩展法,大部分涉及数组的题目用HashMap存,能够方便很多。阶乘后面的0,其实就是判断除以5。这些都是小技巧。
然后很恐怖的事情总是悄悄发生,我刷着刷着发现前面刷的已经忘的差不多,问过好些刷题的朋友,很正常的情况,但是一定要多多总结,还有就是周赛的话最好也打一下,一般AC俩个(很下饭)。