2023.4.2LeetCode第339场周赛
A. 最长平衡子字符串
思路
枚举每个左端点,求当前最长的平衡子字符串
算法
class Solution {
public:
int findTheLongestBalancedSubstring(string s) {
int n = s.size();
int ans = 0;
for (int i = 0; i < n; i ++ ) {
if (s[i] == '0') {
int j = i;
while (j < n && s[j] == '0') j ++ ;
int m = j;
while (j < n && s[j] == '1') j ++ ;
if (j - m >= m - i) //1的长度大于等于0的长度
ans = max(ans, (m - i) * 2);
}
}
return ans;
}
};
B. 转换二维数组
思路
记录每个数出现的次数,每一层尽可能的放多的数
算法
class Solution {
public:
vector<vector<int>> findMatrix(vector<int>& nums) {
int n = 210;
vector<int> cnt(n);
for (auto x : nums) cnt[x] ++ ;
vector<vector<int>> ans;
while (true) {
vector<int> t;
for (int i = 1; i < n; i ++ )
if (cnt[i] > 0) {
t.push_back(i);
cnt[i] -- ;
}
if (t.size() == 0) break;
ans.push_back(t);
}
return ans;
}
};
C. 老鼠和奶酪
思路
排序,尽可能让分数最大化,优先选择收益大的
算法
class Solution {
public:
int miceAndCheese(vector<int>& r1, vector<int>& r2, int k) {
int ans = 0;
vector<pair<int, int>> a;
int n = r1.size();
for (int i = 0; i < n; i ++ ) {
a.push_back({r1[i] - r2[i], i});
}
sort(a.begin(), a.end(), greater<>());
for (int i = 0; i < n; i ++ ) {
if (i < k) ans += r1[a[i].second];
else ans += r2[a[i].second];
}
return ans;
}
};