復(fù)盤|第358場周賽
數(shù)組中的最大數(shù)對和
【一次遍歷】用一個長為10的數(shù)組max_val維護最大數(shù)位為i的元素的最大值,當遍歷到nums[i]時,設(shè)其最大數(shù)位為max_d,用nums[i] + max_val[max_d]更新答案。
翻倍以鏈表形式表示的數(shù)字
【一次遍歷】如果不考慮進位,cur.val會變成cur.val * 2 % 10,如果cur.next有進位,那么cur.val需要+=1。如果鏈表頭的值≥5,那么需要在前面加一個新節(jié)點。
限制條件下元素之間的最小絕對差
【平衡樹 + 雙指針 + 二分】對于每個位置i,只需將其與[0, i - x]的數(shù)值相比較,遍歷nums是,維護一個有序數(shù)組,包含nums中[0, i - x]的元素,通過二分查找到nums[i]插入位置,與相鄰位置作比較。有序數(shù)組初始化時可以放兩個哨兵。
操作使得分最大
【貢獻法 + 單調(diào)棧 】貪心思想,先考慮nums中最大的元素x,需要知道有多少個子數(shù)組可以取x作為質(zhì)數(shù)分數(shù)最高的元素。先把[1,10^5]中的每個數(shù)的質(zhì)數(shù)分數(shù)(不同質(zhì)因子的數(shù)目)預(yù)處理出來,記作數(shù)組PRIMES。然后用單調(diào)棧求出每個i左側(cè)質(zhì)數(shù)分數(shù)大于等于PRIMES[nums[i]]的最近的數(shù)的下標left[i(不存在則為-1),以及右側(cè)質(zhì)數(shù)分數(shù)大于PRIMES[nums[i]]的最近的數(shù)的下標right[i](不存在則為n)。注意,不能在i左側(cè)包含質(zhì)數(shù)分數(shù)和PRIMES[nums[i]]一樣的數(shù),否則不滿足題目「如果多個元素質(zhì)數(shù)分數(shù)相同且最高,選擇下標最小的一個」的要求。所以對于左側(cè)用"大于等于"。那么子數(shù)組的左端點可以在(left[i],i)內(nèi),子數(shù)組的右端點可以在[i,rght[i])內(nèi)。根據(jù)乘法原理,一共有tot=(i-left[i])×(right[i]-i)個子數(shù)組以nums[i]作為這個子數(shù)組的質(zhì)數(shù)分數(shù)。設(shè)k'=min(k,tot),則nums[i對答案的貢獻為nums[i]^k'(用快速冪計算)。根據(jù)上式,按照nums從大到小的順序計算貢獻,一邊計算一邊更新剩余操作次數(shù)k。