復盤|第82場雙周賽
計算布爾二叉樹的值
【遞歸】簡潔寫法——自身遞歸。
坐上公交的最晚時間
【雙指針模擬】排序后,用雙指針模擬乘客上車的過程:遍歷公交車,找哪些乘客可以上車(先來先上車)。模擬結束后:如果最后一班公交還有空位,可以在發(fā)車時到達公交站,如果此刻有人,可以順著他往前找到沒人到達的時刻;如果最后一班公交沒有空位,可以找到上一個上車的乘客,順著他往前找到一個沒人到達的時刻。
最小差值平方和
【貪心】等價轉換——在nums1[i]上+1,等價于在nums2[i]上-1,反之亦然。原問題可轉換為對數組a[i] = nums1[i] - nums2[i] 執(zhí)行 k = k1 + k2 次操作,能得到的Σa[i]^2的最小值。對于兩個數先把大的數-1會更優(yōu),先將a倒序排序,然后從左到右遍歷,同時更新剩余操作次數k。當遍歷到a[i]時,a[0]到a[i - 1]均已減小至a[i],判斷k次操作能否讓a[0]到a[i]全部減小至a[i + 1] 。比較k與所需次數c=(i+1)(a[i-a[i+1])的大小。如果c<k,那么從a0]到a[i]均可以減小至a[i+1],更新k=k-c。如果c≥k,那么從a[0]到a[i]中:有k mod(i+1)個元素可以額外減小 +1;有i+1-kmod(i+1)個元素可以額外減小后續(xù)無法繼續(xù)減小,應退出循環(huán)。代碼實現時,可以在a末尾加一個哨兵0,減少邊界判斷。
元素值大于變化閾值的子數組
【并查集】數組中的元素越大越好,不妨從大往小考慮nums[i]。子數組的長度k越大,threshold/k就越小,越能滿足要求。把考慮過的元素都串起來,這條鏈的長度就是k。需要動態(tài)維護每條鏈的長度,高效地串聯(lián)兩條鏈。用并查集,遍歷到nums[i]時,用并查集合并i和i+1,這樣可以把連續(xù)訪問過的位置串起來,同時維護鏈的長度。
【單調?!棵杜e每個元素,假設它是子數組中的最小值,用單調棧計算左右邊界。