原创 經典啓蒙:子數和

遞歸暴力 看到題,二話不說直接遞歸,然後果斷超時。 class Solution: def __init__(self): self.counts=0 def helper(self,nums,tar

原创 去除重複字母

要求一、要去重。 要求二、去重字符串中的字符順序不能打亂 s 中字符出現的相對順序。 要求三、在所有符合上一條要求的去重字符串中,字典序最小的作爲最終結果。 有序需要依賴單調棧,最佳的情況是小的放前面打的放後面,這可以依賴單調棧,但是如

原创 常數時間插入刪除獲取元素

刪除的時候,交換最後一個元素與被刪除元素,然後pop最後一個元素。記錄交換元素的新位置,寫入hashmap。 插入查詢map發現存在則不插入,如果不存在則push_back。 刪除查詢map發現不存在則不刪除,如果存在則與最後一位元素交

原创 (二分左端點)愛喫香蕉的珂珂

利用二分查找最優的K,K得到後在計算中也引入二分查找左端點優化計算。 class Solution: def left_bound(self,nums, target) : # 單側的情況直接返回解

原创 循環數組單調棧

一個點前後的點都可以是它的解,同一個點相等肯定不會入棧。 class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) {

原创 刪除被覆蓋區間

將區間left小的放前面,相同left的取right更小的放後面。其實就是道排序題。 排序使用外置cmp或者static cmp不太方便,建議用lambda表達式。 bool cmp(vector<int>&a,vector<int>&b

原创 單鏈表判定迴文

方法一 (後序遞歸+全局left指針,遞歸內right指針) ,時間複雜度O(n),空間複雜度O(n) 利用後序遞歸+全局left指針,遞歸裏面只要判斷right是否==left。(left與right無法判斷相對位置關係) clas

原创 前序中序後序遍歷恢復樹

前序+中序恢復: 基於前序映射中序位置得到左右兩側長度,再反推前序left,right與中序left,right的位置。然後遞歸求root->left,right class Solution { public: TreeNo

原创 遞歸版翻轉鏈表

last指向最後一個節點5(也就是翻轉結束後的頭節點,遞歸裏面直接return 不需要修改),(head.next).next=head 負責把當前的 ... -> 3 -> 4 變成 3 <- 4,然後3->null,因爲它現在是隊頭變

原创 最小編輯距離(Edit Distance)

編輯距離(Edit Distance),又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括: (1)任意位置插入一個字符 (2)任意位置刪除一個字符 (3)任意未知修改一個字符 將

原创 [a,b]不包含49的數的個數

https://blog.csdn.net/weixin_43701790/article/details/98379811 將區間1 ~ 581按上限拆開,分成1 ~ 499(百位數字小於5)、500 ~ 579(百位爲5,十位數字小

原创 我能贏嗎

特例一:如果最大能選擇的數字maxChoosableInteger比期望的總數desiredTotal要大,先手穩贏,返回True 特例二:如果能選擇的所有數字總和比期望的總數desiredTotal要小,一定到達不了desiredTo

原创 最長迴文子序列(IPS)

dp[i][j]:字符串s在[i, j]範圍內最長的迴文子序列的長度 遞歸解法: 1.如果str的最後一個元素和第一個元素是相同的,則有:lps(0,n-1)=lps(1,n-2)+2;例如字符串序列“AABACACBA”,第一個元素

原创 戳氣球

開區間(i,j)最左邊索引 i,最右邊索引 j。這裏說開區間的意思是,我們只能戳爆 i 和 j 之間的氣球,i 和 j 不要戳。這個區間最後一個被戳爆的氣球就是k。(逆向思維) 前後填充1,[3,1,5]->[1,3,1,5,1],相當

原创 每個人戴不同帽子

i表示帽子1->40,j代表二進制下人的狀態,dp[i][j]代表帽子i對應的人的分配狀態j下的解個數,最終的結果是最後頂帽子確定是否戴且所有人都有帽子情況下的解個數dp[-1][-1] dp[i][j]可以選擇不戴帽子i=dp[i-1