關於這段時間刷算法的總結
- 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倆個(很下飯)。