【2022/03/20-第285场单周赛】复盘

总结

Q1.统计数组中峰和谷的数量

把连续的相同数字合并,然后找峰和谷。

class Solution {
public:
    int countHillValley(vector<int>& nums) {
        int ret = 0, pre = 0;
        vector<int> v;
        for(int i = 0; i < nums.size(); ++i){
            if(nums[i] != pre) v.push_back(nums[i]);
            pre = nums[i];
        }
        for(int i = 1; i < v.size() - 1; ++i){
            int l = v[i - 1], r = v[i + 1];
            if((v[i] > l && v[i] > r) || (v[i] < l && v[i] < r)) ++ret;
        }
        return ret;
    }
};

Q2.统计道路上的碰撞次数

对于L,只要左边有S或者R就必定会撞。
对于R,只要右边有S或者L就必定会撞。
对于S,不计入结果。

class Solution {
public:
    int countCollisions(string s) {
        int n = s.size();
        int rl = 0, rr = 0, rs = 0, ll = 0, ls = 0, lr = 0;
        for(auto i : s){
            if(i == 'L') ++rl;
            if(i == 'R') ++rr;
            if(i == 'S') ++rs;
        }
        int ret = 0;
        for(int i = 0; i < n; ++i){
            if(s[i] == 'L'){
                --rl;
                ++ll;
                if(ls + lr > 0) ++ret;
            }
            if(s[i] == 'R'){
                --rr;
                ++lr;
                if(rs + rl > 0) ++ret;
            }
            if(s[i] == 'S'){
                --rs;
                ++ls;
            }
        }
        return ret;
    }
};

Q3.射箭比赛中的最大得分

对每个得分位置dfs。

class Solution {
public:
    int mx = 0;
    
    void dfs(int index, int rest, int score, vector<int> &ret, vector<int> &temp, vector<int> &alice){
        if(index == 0){
            if(score > mx){
                mx = score;
                temp[0] = rest;
                ret = temp;
                temp[0] = 0;
            }
            return ;
        }
        if(rest > alice[index]){
            temp[index] = alice[index] + 1;
            dfs(index - 1, rest - alice[index] - 1, score + index, ret, temp, alice);
            temp[index] = 0;
        }
        dfs(index - 1, rest, score, ret, temp, alice);
    }
    
    vector<int> maximumBobPoints(int numArrows, vector<int>& aliceArrows) {
        vector<int> ret(12, 0), temp(12, 0);
        dfs(11, numArrows, 0, ret, temp, aliceArrows);
        return ret;
    }
};

Q4.由单个字符重复的最长子字符串
线段树应用,先放着。

posted on 2022-05-06 13:05  damnglamour  阅读(22)  评论(0)    收藏  举报