原创 【Leetcode】555. Split Concatenated Strings 555. 分割連接字符串

解法 首先,假設所有的字符串都不會反轉,注意到在連接的時候string的順序是不會變的。 假設可以表示爲s1,s2,...,sj,...,sns_1,s_2,...,s_j,...,s_ns1​,s2​,...,sj​,...,

原创 【Kickstart】2019 Round E - Street Checkers

解法 就是要求[L,R]裏的每個整數中,有多少個整數的奇因子和偶因子個數之差不超過2. 對於奇數來說,它只可能有奇因子,那麼需要奇因子個數少於2,那麼只能是質數或1 對於偶數來說,假設x=2m⋅nx = 2^m\cdot nx=

原创 【Kickstart】2019 Round C - Wiggle Walk

解法 rc個點映射到一維ID,然後維護4個方向的並查集: 比如E方向的並查集,最開始,每個點都代表它自己,當某個點被訪問過之後,如果有人向東走到了這個點,那麼它應該直接走到這個點東邊第一個沒有被訪問的點,那就是這個點的root 所

原创 【Kickstart】2018 Round B - No Nine

解法 首先,把問題轉化成要求f[x],既小於等於x的合法數字的個數。這樣在F和L之間的數就可以用f[F]-f[L]+1來得到了。 如果我們從0開始,用9進製表示整個自然數數列,我們可以得到: 0 1 2 …… 8 9 ……

原创 【Kickstart】2019 Round C - Catch Some

解法 假如最後必須返回終點,可以DP 每個顏色記錄狗的位置,從小到大排序 對於f[i][s]表示,只考慮前i個顏色時,訪問s個狗需要的最小時間 那麼有: f[i][s] = min(f[i-1][s], f[i-1][s-j-1]

原创 【Leetcode】713. Subarray Product Less Than K 乘積小於K的子數組

解法 呃……竟然忘記了尺取法…… class Solution: def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:

原创 【Kickstart】2019 Round E - Cherries Mesh

解法 就是想求最小生成樹,但是邊的權重只有1和2,而且給出了權重爲1的邊,剩餘邊權重都爲2 顯然,可以用最小生成樹的某個算法,權重爲1的邊只加上那些能聯通兩個不同集合的邊 輸入完畢之後會得到k個聯通分量,需要k-1條權重爲2的邊,

原创 【Leetcode】959. Regions Cut By Slashes 959. 由斜槓劃分區域

解法 就是並查集,把每個1x1的方格再劃分成4個格子,比如這樣: class Solution: def regionsBySlashes(self, grid: List[str]) -> int:

原创 【Leetcode】1144. Decrease Elements To Make Array Zigzag 1144. 遞減元素使數組呈鋸齒狀

解法 可以從左向右掃一遍,直接取最少次數就好 但是還有一種巧妙的解法 如果對於數字a,b,c,想使得a>b<c, 那麼只需要令b = max(b, min(a,c)-1),就能獲得最少的操作次數 那麼對於其中一種pattern

原创 【Leetcode】678. Valid Parenthesis String 有效的括號字符串

解法 跟沒有*的時候原理差不多,貪心,不斷統計待匹配的左括號(的數量left,能匹配的時候儘量匹配 *可以被分成三類: 未轉化的:它既可以轉化成(,也可以轉化成) 轉化成)的:它可以通過跟一個遇不到左括號的)交換,重新變成未

原创 【Kickstart】2018 Round H - Let Me Count The Ways

解法 用容斥原理做 假設P(n,i)表示n對夫婦時,有i隊夫婦粘在一起的種類數: 我們選出i對夫婦,有C(m,i)種可能,把粘在一起的夫婦算做一個人,總共有2n-i個人全排列種排法,每個粘在一起的夫婦都有2種排法,所以總共有P(n

原创 【Leetcode】1153. String Transforms Into Another String 1153. 字符串轉化

解法 遍歷一遍str1,就知道str1的每個字符應該映射到誰了 但是1個字符不能映射到2個字符 同時 str1裏的字符個數應該少於str2裏的字符個數 此外,如果str2有26個字符時,除非兩個字符串相等,否則不可能轉化成功,

原创 【Leetcode】795. Number of Subarrays with Bounded Maximum 795. 區間子數組個數

解法 就是 最大值不超過R的子數組裏,也包括了最大值<L的子數組,以及最大值在[L,R]裏的子數組,而這兩部分是不相交的,所以利用互斥性,直接計算出【最大值不超過R的子數組】以及【最大值<L的子數組】的個數,然後相減即可 cla

原创 【Kickstart】2019 Round E - Code-Eat Switcher

解法 對於每天的a和b,我們不妨假設所有的時間都用來coding,這樣能得到totalC的coding時間 顯然,如果totalC<a,這天顯然不能完成 否則,我們假設able = totalC-a,這表示多出來了able的co

原创 【Kickstart】2019 Round C - Circuit Board

解法 算出每列往左的長度,然後就能轉化成求直方圖最大矩形的問題 至於如何求第i行第j列往左有多長,需要每行維護兩個雙向隊列minStack、maxStack和一個左邊界l,對於範圍(l,j],minStack隊頭是這個範圍內最小值