Leetcode 183场周赛
1
#include <algorithm>
class Solution {
public:
vector<int> minSubsequence(vector<int>& nums) {
sort(nums.begin(), nums.end());//升序排列
vector<int> ans;
int sum[505];
memset(sum,0,sizeof(sum));
sum[0] = nums[0];
for (int i = 1; i < nums.size(); i++) { //计算前缀和
sum[i] = sum[i-1] + nums[i];
}
for (int i = nums.size() - 2; i >= 0; i--) {
if (sum[i] <sum[nums.size() - 1] - sum[i]) {
for (int j = nums.size() -1 ; j >= i +1 ;j--) {
ans.push_back(nums[j]);//降序插入到数组中
}
break;
}
}
if (ans.size() == 0) return nums;
return ans;
}
};
2
using namespace std;
class Solution {
public:
int numSteps(string s) {
long long x = 0;
int cnt = 0;
long long d = 1;
string s1 = "0",s2= "1";
while (s.length() != 1 || s[0] !=\'1\' ) {
int index = s.length() - 1;
if (s[index] == \'0\') {
s.pop_back();
}
else if (s[index] == \'1\') {
s[index] = \'0\';
for (int j = index - 1; j >= 0; j--) {
if (j == 0 && s[j] == \'1\') {
s[j] = \'0\';
s = s2 + s;
break;
}
if (s[j] == \'1\') {
s[j] = \'0\';
continue;
}
else if (s[j] == \'0\') {
s[j] = \'1\';
break;
}
}
}
cnt++;
}
return cnt;
}
};
3
/*
假设给出数据为 a >= b >= c。其他情况也可经过排序转化为这种情况。
首先拿出 c 个 \'a\', \'b\', \'c\' 进行拼接。
再拿出 b-c 个 \'a\',\'b\' 进行拼接。此时所有 \'b\',\'c\' 都已拼接到答案中,仅剩 a-b 个 \'a\' 未拼接。
然后可以通过暴力枚举将尽可能多的 \'a\' 插入到答案中。
*/
class Solution {
bool check(int pos, const string &str, const string &ch) {
string a = str;
a.insert(pos, ch);
for(int i = 0; i+2 < a.size(); i++) {
if(a[i] == ch[0] && a[i+1] == ch[0] && a[i+2] == ch[0]) {
return false;
}
}
return true;
}
public:
string longestDiverseString(int a, int b, int c) {
vector<pair<int, string>> vec;
vec.push_back(make_pair(a, string("a")));
vec.push_back(make_pair(b, string("b")));
vec.push_back(make_pair(c, string("c")));
sort(vec.begin(), vec.end());
string str;
while(vec[0].first > 0) {
vec[0].first --;
vec[1].first --;
vec[2].first --;
str += vec[2].second;
str += vec[1].second;
str += vec[0].second;
}
while(vec[1].first > 0) {
vec[1].first --;
vec[2].first --;
str += vec[2].second;
str += vec[1].second;
}
while(vec[2].first > 0) {
bool flag = false;
for(int i = 0; i <= str.size(); i++) {
if(check(i, str, vec[2].second)) {
str.insert(i, vec[2].second);
flag = true;
break;
}
}
if(flag == false) {
break;
}
vec[2].first --;
}
return str;
}
};
4
class Solution {
public:
string stoneGameIII(vector<int>& stoneValue) {
int len = stoneValue.size();
//dp[i]表示的含义是:先手者从i开始拿,最多能从剩余数组中得到多少领先
//初始化为0,,并且长度稍微大于len以便留一定的余量
vector<int> dp(len + 1, 0);
//根据题意,子问题都在当前问题的后面,要从后往前,确保之前的子问题已经求出解
for (int i = len - 1; i >= 0; i--) {
int mt = INT_MIN; //mt为从i开始取能获得的最大领先,初始化为负无穷
int sum = 0;//取的累计和
//尝试取1个,2个,3个 或者取到最末尾(j< len),然后求得不同取法的最大值,就是当前问题的解
for (int j = i; j < i + 3 && j < len; j++) {
sum += stoneValue[j]; //取的累计和
int t = sum - dp[j + 1]; // 取完后,轮到对手取了,所以要减去对手能获得的最大分数,就是自己的得分
mt = max(t, mt);
}
dp[i] = mt;
}
if (dp[0] > 0) return "Alice";
else if (dp[0] < 0) return "Bob";
else return "Tie";
}
};