Leetcode 183场周赛

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";
	}
};

posted @ 2020-04-06 19:46  DengSchoo  阅读(123)  评论(0编辑  收藏  举报