LeetCode第 283 場周賽題解
阿新 • • 發佈:2022-03-06
6016. Excel 表中某個範圍內的單元格
題目描述:自己讀題
思路:根據題意模擬即可
時間複雜度:\(O(能過)\)
參考程式碼:
class Solution { public: vector<string> cellsInRange(string s) { vector<string> res; int lr = s[0] - 'A', rs = s[3] - 'A'; int len1 = s[1] - '0' , len2 = s[4] - '0'; for(int i = lr ; i <= rs ; ++i){ for(int j = len1 ; j <= len2 ; ++j){ string str = (char)('A' + i) + to_string(j); res.push_back(str); } } return res; } };
6017. 向陣列中追加 K 個整數
題目描述:給你一個數組\(nums\),讓你新增\(k\)個不在\(nums\)中出現的數字,並且使得這\(k\)個數字的和最小。
思路:比較明顯的貪心,先假定最終新增的是\([1...k]\),然後根據其中的數字是否在\(nums\)中出現過進行修改即可。
時間複雜度:\(O(nlogn)\)
參考程式碼:
class Solution { public: long long minimalKSum(vector<int>& nums, int k) { long long res = 1ll * k * (k + 1) / 2; set<int>s; for(int& num : nums) s.insert(num) ; for(auto& val : s){ if(val > k) break; if(val <= k) res -= val; ++k; res += k; } return res; } };
6018. 根據描述建立二叉樹
題目描述:給定父子關係,根據父子關係構建二叉樹,保證有解。
思路:根據題意模擬即可
時間複雜度:\(O(n)\)
參考程式碼:
class Solution { public: TreeNode* createBinaryTree(vector<vector<int>>& descriptions) { vector<TreeNode*> tr(100005 , nullptr); vector<int>income(100005 , 0), outcome(100005 , 0); set<int>s; for(auto& des : descriptions){ int u = des[0] , v = des[1] , w = des[2]; if(tr[u] == nullptr) tr[u] = new TreeNode(u , nullptr , nullptr); if(tr[v] == nullptr) tr[v] = new TreeNode(v , nullptr , nullptr); if(w == 0) tr[u]->right = tr[v]; else tr[u]->left = tr[v]; income[v]++; outcome[u]++; s.insert(u); s.insert(v); } int rt = 0; for(auto& v : s){ if(income[v] != 0 || outcome[v] == 0) continue; rt = v; break; } return tr[rt]; } };
6019. 替換陣列中的非互質數
題目描述:給你一個整數陣列 nums
。請你對陣列執行下述操作:
- 從
nums
中找出 任意 兩個 相鄰 的 非互質 數。 - 如果不存在這樣的數,終止 這一過程。
- 否則,刪除這兩個數,並 替換 為它們的 最小公倍數(Least Common Multiple,LCM)。
- 只要還能找出兩個相鄰的非互質數就繼續 重複 這一過程。
返回修改後得到的 最終 陣列。可以證明的是,以 任意 順序替換相鄰的非互質數都可以得到相同的結果。
思路:比較明顯的模擬,使用棧維護一下即可。我為了輸出方便使用了雙端佇列。
時間複雜度:\(O(nlogn)\)
參考程式碼:
class Solution {
public:
vector<int> replaceNonCoprimes(vector<int>& nums) {
deque<long long>q;
for(auto& num : nums){
if(q.empty()) q.push_back(num);
else{
int u = q.back();
int gd = gcd(u , num);
if(gd == 1) q.push_back(num);
else{
q.pop_back();
long long dx = 1ll * u * num / gd;
while(!q.empty() && gcd(dx , q.back()) != 1){
u = q.back();
q.pop_back();
dx = 1ll * dx * u / gcd(dx , 1ll * u);
}
q.push_back(dx);
}
}
}
vector<int>res;
while(!q.empty()){res.push_back(q.front()); q.pop_front();}
return res;
}
};