LeetCode253周赛
LeetCode
来源:LeetCode253周赛
第一题
遍历判断就可以了
class Solution {
public:
bool isPrefixString(string s, vector<string>& words) {
string c = "";
for(auto i : words){
c += i;
if(c == s) return true;
}
return false;
}
};
第二题
优先队列,每次取最大值除二向下取整
class Solution {
public:
int minStoneSum(vector<int>& piles, int k) {
priority_queue<int> q;
int res = 0;
for(auto i : piles){
res += i;
q.push(i);
}
for(int i = 1;i <= k;i++){
auto t = q.top();
q.pop();
res -= t >> 1;
q.push(t - (t >> 1));
}
return res;
}
};
第三题
由于括号是匹配的,’['的权值设为1, ']‘的权值设为-1,对于每一个平衡字符串,他的权值和应该为0,,所以遍历字符串,当权值大于0的时候,继续遍历,当发现’]'括号多的时候,那么肯定要进行一次交换
class Solution {
public:
int minSwaps(string s) {
int l = 0, r = 0, res = 0;
for(auto i : s){
if(i == '[') l++;
else r++;
if(r > l){
res++;
l++;
r--;
}
}
return res;
}
};
第四题
找到以每个点结尾递增序列的长度,树状数组维护最大值
以下代码还可以用来求最大上升子序列之和
只需要把这一句改成每次加原数组的那一个数即可,可以多开一个数组来存,这里不需要,就没有存
int ans = get(a[i]) + 1;
class Solution {
public:
int n;
int c[100010];
void add(int x, int y) {
for(int i = x;i <= n;i += (i & -i)){
c[i] = max(y, c[i]);
}
}
int get(int x) {
int res = 0;
for(int i = x;i;i -= (i & -i)){
res = max(res, c[i]);
}
return res;
}
vector<int> longestObstacleCourseAtEachPosition(vector<int>& a) {
vector<int> res;
vector<pair<int, int>> b;
n = a.size();
for(int i = 0; i < n;i++) b.push_back({a[i], i});
sort(b.begin(), b.end());
int tot = 0;
for(int i = 0;i < n;i++){
if(i == 0 || b[i].first != b[i - 1].first){
++tot;
}
a[b[i].second] = tot;
}
for(int i = 0;i < n;i++){
int ans = get(a[i]) + 1;
res.push_back(ans);
add(a[i], ans);
}
return res;
}
};