原创 187. 重複的DNA序列
以10個字母的string作爲一個查找的最小單位。要注意map[s.substr(i, 10)] == 2 是爲了去重,同時以及邊界條件。 class Solution { public: vector<string> findR
原创 199. 二叉樹的右視圖
這道題非常的好。可以用depth-first search 以及breadth-first兩種解法。參考了 https://leetcode-cn.com/problems/binary-tree-right-side-view/solu
原创 173. 二叉搜索樹迭代器
二叉搜索樹迭代器 考了幾個知識點:1. 二叉搜索樹迭代器 2. 迭代器。 難點就是O1的時間複雜度以及Oh 的空間複雜度。 /** * Definition for a binary tree node. * struct TreeN
原创 24. 兩兩交換鏈表中的節點
主要是記錄中間狀態, before以及after兩個指針。另外注意終止條件:while(before->next!= NULL && before->next->next!=NULL){ 避免報錯。 另外還有別人總結的遞歸的騷解法。 //
原创 108. 將有序數組轉換爲二叉搜索樹
因爲是有序數組,取中間位置的值爲樹根。將數組分成兩半。 對左半遞歸構建左子樹。對右半遞歸構建右子樹。 就是一個二分法。 class Solution { public: TreeNode* sortedArrayToBST(vec
原创 3. 無重複字符的最長子串
主要的思路是雙指針+ hash_map。 class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size() <= 1)
原创 5. 最長迴文子串
主要的知識點就是DP問題。 有些基礎知識點還順便補了一下,二維數組的初始化。 mark一下:int dp[s.size()][s.size()]; 這種方式需要自己初始化爲0;vector<vector<int>> dp(s.size(
原创 11. 盛最多水的容器
雙指針,分別指向兩端,每次移動的是比較短的那段,關於這個的說法,leetcode有人做了證明,我這裏把這種算法理解爲貪心法。每次都是做的看似最大的選擇,只是猜測。 int maxArea(vector<int>& height) {
原创 110. 平衡二叉樹
就是深度優先收索。DFS 判斷當前root左子樹和右子數的高度,然後遞歸判斷左邊右邊是否banlanced. class Solution { public: int height(TreeNode* root){
原创 8. 四數之和
基本和3sum 差不多,都是雙指針,只不過多了一層循環,所以算法時間複雜度是o(n3), 空間複雜度是O(1). vector<vector<int>> fourSum(vector<int>& nums, int target) {
原创 23. 合併K個排序鏈表
這個就是分治算法的一個實例。K個合併,先是兩兩合併,然後最後merge在一起。這裏有兩個trick,一個是用合併了的lsit替換合併的第一個.另外就是再size是奇數的處理,畫一個實例圖可解。 c++ 遺忘知識點:除法默認是向下取整,3/
原创 70. Climbing Stairs
也是典型的DP問題,邊界:nums[1] = 1;nums[2] = 2; 狀態轉移方程: nums[i] = nums[i-1] + nums[i-2]; class Solution { public: int climbSt
原创 58. Length of Last Word
就是從後往前找非空元素,很簡單。主要是注意一些corner case. class Solution { public: int lengthOfLastWord(string s) { if(! s.length
原创 53. Maximum Subarray
from https://www.cnblogs.com/hithongming/p/9229871.html 動態規劃特點: 把原始問題劃分成一系列子問題; 求解每個子問題僅一次,並將其結果保存在一個表中,以後用到時直接存取,不重複計算
原创 19. Remove Nth Node From End of List
這個主要的知識點主要是1.雙指針,2.在head前面用dummy的指針。 public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode*