原创 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*