LeetCode 第 193 場周賽 解題報告

2022-01-10 11:26:27 字數 1878 閱讀 3120

根據題目給出的公式 runningsum[i] = sum(nums[0]…nums[i]),可得:

class solution 

};

如果要刪除 k 個數之後,剩餘的數字種類最少

那麼就要移除盡可能多的型別的數字,

那麼就是要先刪除那些出現次數最少的那些數字咯。

可以先統計每個數字出現的次數,然後對次數進行公升序排序,然後嘗試刪除頭部的數字即可。

class solution else break;

}return ans;}};

首先最暴力的解法,從 1 開始暴力列舉天數 i ,然後檢查前 i 天盛開的花是否能滿足需求。這樣的時間複雜度是 o(n*m)。

不難發現,如果第 i 天可以滿足要求,那麼第 i 天之後盛開的花肯定也能滿足需求。

也就是說,答案具備二分的前置要求——單調性。

接下來我們通過二分找到乙個最小的 i,使其滿足[0, i-1) 天盛開的花不能滿足需求,[i, +∞) 天盛開的花都能滿足需求。

如果不存在這樣的 i,那麼答案就是 -1。

設答案可能的取值範圍為 [1, 1e9]。首先判斷(1+1e9)/2 是否能滿足需求。

依此類推,每次檢查都能排除掉一半的候選值。所以做多需要檢查約 30 次,即log(1e9) 次。

這道題沒接觸過就沒寫了,賽後才知道是樹的遍歷 + 倍增

倍增建邊過程:

如果結點 i 個所有祖先結點已經建邊完成,那麼可以詢問 i 個第 1,2,4,8,16 … 個祖先結點,直到其某個祖先節點不存在。對於每次詢問利用祖先結點已經建好的邊可以o(logn)的時間複雜度完成。所以可以按照先序遍歷的順序來進行建邊。

class treeancestor 

dfs(parent, parent[id]);

for(int i = 1; ; i <<= 1)

anc[id].push_back(p);

}mark[id] = true;

}public:

treeancestor(int n, vector& parent)

}int getkthancestor(int node, int k)

if(k == 0)

if(node == 0)

int i = 1, pos = 0;

while(i*2 <= k && pos+1 < anc[node].size())

return getkthancestor(anc[node][pos], k-i);

}};/**

* your treeancestor object will be instantiated and called as such:

* treeancestor* obj = new treeancestor(n, parent);

* int param_1 = obj->getkthancestor(node,k);

*/

LeetCode第193場周賽

class solution class solution return que.size 這裡yxc 寫的極好 yxc 用區間來處理 常數大部分情況下更小 class solution intmindays vector int bs,int m,int k vector int l n 2 r ...

LeetCode 第 193 場周賽

5436.一維陣列的動態和 給你乙個陣列nums。陣列 動態和 的計算公式為 runningsum i sum nums 0 nums i 請返回nums的動態和。示例 1 輸入 nums 1,2,3,4 輸出 1,3,6,10 解釋 動態和計算過程為 1,1 2,1 2 3,1 2 3 4 示例 ...

LeetCode 第 193 場周賽(C )

給你乙個陣列nums。陣列 動態和 的計算公式為 runningsum i sum nums 0 nums i 請返回nums的動態和。示例 1 輸入 nums 1,2,3,4 輸出 1,3,6,10 解釋 動態和計算過程為 1,1 2,1 2 3,1 2 3 4 1 nums.length 100...