根據題目給出的公式 runningsum[i] = sum(nums[0]…nums[i]),可得:
如果要刪除 k 個數之後,剩餘的數字種類最少,class solution
};
那麼就要移除盡可能多的型別的數字,
那麼就是要先刪除那些出現次數最少的那些數字咯。
可以先統計每個數字出現的次數,然後對次數進行公升序排序,然後嘗試刪除頭部的數字即可。
首先最暴力的解法,從 1 開始暴力列舉天數 i ,然後檢查前 i 天盛開的花是否能滿足需求。這樣的時間複雜度是 o(n*m)。class solution else break;
}return ans;}};
不難發現,如果第 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...