原创 通用算法 - [博弈論] - 雙人取數遊戲

1、問題描述 給定一個數組nums,a、b兩人輪流從數組的左端或右端取一個數作爲自己的得分,假設兩人足夠聰明,都採用最優的策略取數,且a先取,問a能能拿到的最大的分數是多少? 示例: 輸入:nums=[4,7,5,3] 輸出:1

原创 leetcode - [動態規劃] -最大正方形(221)

1、問題描述 在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。 示例: 輸入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出: 4 2、 解題思路 思

原创 leetcode - [哈希表] - 數組中缺失的第一個正整數(41)

1、問題描述 給定一個無序數組,求數組中缺失的第一個正整數。 示例1: 輸入:[1,2,3,4] 輸出:5 示例2: 輸入:[-1, 2, 5, 3] 輸出:1 示例3: 輸入:[5,7,8,9] 輸出:1 2、解題思

原创 leetcode - [動態規劃] - 打家劫舍

1、問題描述 假設你是一個小偷,計劃盜竊沿街的房屋,每個房屋都藏有一定數量的現金,影響你盜竊的唯一制約是每兩間相鄰的房屋裝有相互連通的報警裝置,如果你盜竊了兩間相鄰的房屋就會觸發報警裝置。 給定一個非負整數數組表示每個房屋藏有的現

原创 leetcode - [DP、棧、雙指針] - 接雨水(42)

1、問題描述 給定n個非負整數,每個整數表示一個寬度爲1的柱子的高度, 將這n個柱子並排放在一起,問按這種方式排列得柱子在下雨時能接多少雨水。 上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這

原创 leetcode -[動態規劃、二分查找] - (300)最長遞增子序列LIS

1、問題描述 給定一個無序的數組,求數組中最長遞增子序列的最大長度。 一個數組可能由多個遞增子序列,求這些子序列中的最大長度。 輸入:[10,9,2,3,1,7,18] 輸出:4 解釋:最長的遞增子序列爲[2,3,7,18],其長

原创 通用算法 -[二分查找] - 細節問題

1、二分查找的若干細節問題 二分查找的思路很簡單,但是卻有很多問題需要注意,比如: (1) while循環條件中什麼時候是<=,什麼時候是<? (2) middle什麼時候加1,什麼時候不加1? (3)當不存在查找的數時怎麼處理?

原创 C++ - [動態內存與智能指針]

參考資料:《C++ Primer中文版 第五版》 1、簡介 我們知道除了靜態內存和棧內存外,每個程序還有一個內存池,這部分內存被稱爲自由空間或者堆。程序用堆來存儲動態分配的對象即那些在程序運行時分配的對象,當動態對象不再使用時,我

原创 通用算法 - [樹結構] - 紅黑樹

<1> 紅黑樹 紅黑樹是一種二叉查找樹,但在每個結點上增加了一個存儲位表示結點的顏色,可以是RED或者BLACK。通過對任何一條從根到葉子的路徑上各個着色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出兩倍,因而是接近平衡的。本

原创 通用算法 - [特殊數據結構] - 並查集

並查集——求無向圖的所有連通子圖 求解無向圖的連通子圖,有兩種方法,一種是DFS或BFS,也就是對圖遍歷,另一種方法就是使用並查集。對圖的遍歷非常常見,而並查集的概念就不如遍歷那麼熟悉。其實如果僅是找連通子圖,用DFS對所有節點遍

原创 通用算法 -[排序算法] -選擇排序

1、算法思想 首先,找到數組中最小的那個元素,將它和數組的第一個元素交換位置(如果第一個元素就是最小元素那麼它就和自己交換)。然後,仍然在剩下的元素中找到最小的元素,將它與數組的第二個元素交換位置。如此往復,直到將整個數組排序。這

原创 leetcode - [鏈表、排序] - (148)排序鏈表

1、問題描述 在O(nlogn)O(nlogn)O(nlogn)的時間複雜度和O(1)O(1)O(1)的空間複雜度內對鏈表進行排序。 例如: 輸入: 3->2->1->5->4 輸出:1->2->3->4->5 2、解題思路 思

原创 通用算法 -[排序算法] - 堆排序

1、算法思想 先回顧以下堆的概念 堆分爲兩種:最大堆和最小堆,兩者的差別在於節點的排序方式。 在最大堆中,父節點的值比每一個子節點的值都要大。在最小堆中,父節點的值比每一個子節點的值都要小。這就是所謂的“堆屬性”,並且這個屬性對堆

原创 leetcode-[自平衡二叉搜索樹、桶思想] - 存在重複的元素III(220)

1、問題描述 給定一個整數數組nums,k,t,判斷數組中是否存在兩個不同的索引i,j,使得nums[i]和nums[j]之差的絕對值不超過t,i和j之差的絕對值不超過k。 例如: 輸入: nums = [1,2,3,1], k

原创 通用算法 -[排序算法] - 基數排序

1、算法思想 基數排序的排序思路是這樣的:先以個位數的大小來對數據進行排序,接着以十位數的大小來多數進行排序,接着以百位數的大小…… 排到最後,就是一組有序的元素了。不過,他在以某位數進行排序的時候,是用“桶”來排序的。 由於某位