2021.12.19LeetCode第272场周赛
2108. 找出数组中的第一个回文字符串
思路
逐个判断是否为回文串
判断时将两个指针放在头尾 逐一匹配
代码
class Solution {
public:
string firstPalindrome(vector<string>& words) {
for (string s : words) {
int i = 0, j = s.size() - 1;
bool f = true;
while (i < j) {
if (s[i] != s[j]) {
f = false;
break;
}
i ++ , j -- ;
}
if (f)
return s;
}
return "";
}
};
2109. 向字符串添加空格
思路
重新开一个字符串存储
枚举到指定位置时加入空格
代码
class Solution {
public:
string addSpaces(string s, vector<int>& spaces) {
string ans = "";
int i = 0, k = 0;
for (char c : s) {
if (k < spaces.size() && i == spaces[k])
ans.push_back(' '), k ++ ;
ans.push_back(c);
i ++ ;
}
return ans;
}
};
2110. 股票平滑下跌阶段的数目
思路
枚举所有价格 记录当前连续下降的天数t
每次累加以当前节点为右端点的区间个数 可以找到t
个不同的
代码
class Solution {
public:
long long getDescentPeriods(vector<int>& p) {
long long ans = 0;
int n = p.size();
long long t = 1;
for (int i = 0; i < n; i ++ ) {
if (i && p[i] == p[i - 1] - 1) t ++ ;
else t = 1;
ans += t;
}
return ans;
}
};
2111. 使数组 K 递增的最少操作次数
思路
最长不下降子序列
每隔k
个为一组 找出这个序列中最长不下降子序列的长度
再用总长度减去就是最少操作次数
代码
class Solution {
public:
int kIncreasing(vector<int>& arr, int k) {
int n = arr.size();
int ans = 0;
for (int i = 0; i < k; i ++ ) {
vector<int> a;
int st = i;
while (st < n) {
a.push_back(arr[st]);
st += k;
}
int cnt = longup(a);
ans += a.size() - cnt;
}
return ans;
}
int longup(vector<int> &a) {
vector<int> b;
for (int x : a) {
if (b.empty() || x >= b.back()) b.push_back(x);
else {
int t = upper_bound(b.begin(), b.end(), x) - b.begin();
b[t] = x;
}
}
return b.size();
}
};