復(fù)盤|第351場周賽
美麗下標(biāo)對的數(shù)目
【遍歷】O(n^2)遍歷,循環(huán)x//=10取第一個數(shù),nums[j]%10取最后一個數(shù)。
【優(yōu)化遍歷】O(10n)遍歷,遍歷nums的同時存前面數(shù)字的第一個數(shù)出現(xiàn)的次數(shù),遍歷的時候判斷當(dāng)前數(shù)字最后一個數(shù)與前面的數(shù)互質(zhì)直接加上該數(shù)出現(xiàn)的次數(shù)。
得到整數(shù)零需要執(zhí)行的最少操作數(shù)
【枚舉】假設(shè)每次操作只會減去2^i,設(shè)恰好執(zhí)行k次操作,num1 - k?num2 - k?2^i = 0,num1 - k?2^i = k?2^i,設(shè)x = num1 - num2 * k,可以看出,k的合法范圍是[x.bit_count(), x],至少需要bit_count個2^i,至多用x個2^i,而區(qū)間內(nèi)所有值都能取到,因為每個2^i都能拆成兩個2^(i-1)。
將數(shù)組劃分成若干好子數(shù)組的方式
【乘法原理】考慮在哪插入子數(shù)組的分割邊界,因為每個子數(shù)組都恰好包含一個1,所以前后兩個1之間必須恰好插入一個子數(shù)組的邊界,每兩個1之間有x個0就有x+1種邊界方案,根據(jù)乘法原理,答案是所有邊界方案的乘積,即每兩個1的下標(biāo)差的乘積。用pre存上一個1的下標(biāo),當(dāng)遇到1時更新答案。
機(jī)器人碰撞
【棧模擬】用列表left維護(hù)相左的機(jī)器人,用棧st維護(hù)向右的機(jī)器人,按照題意模擬,代碼實(shí)現(xiàn)時直接在healths上修改。