Leetcode 第272场周赛题解

Leetcode 第272场周赛题解(C++版)

PS:最近的周赛越来越简单了

Problem A -

题意 给你一个字符串数组,找出并返回数组中的 第一个回文字符串 思路 按题意模拟即可。 代码

class Solution {
public:
    bool jud(string s){
        string str=s;
        reverse(s.begin(),s.end());
        return str==s;
    }
    string firstPalindrome(vector<string>& words) {
        for(auto i:words) if(jud(i)) return i;
        return string("");
    }
};

Problem B -

题意 给你一个字符串,以及一个整数数组spaces,在整数数组指示的每一个位置添加空格。 思路 按题意模拟,如果对于字符串的每一个位置都找是不是要添加,那么复杂度达到 O ( m n ) O(mn) O(mn),肯定会超时。注意到我们从前往后检查spaces数组且其是严格递增的,我们考虑设定一个变量指示当前走到了spaces的哪一位,由此可 O ( n ) O(n) O(n)地解决该问题。 代码

class Solution {
public:
    long long subArrayRanges(vector<int>& nums) {
        int n=nums.size();
        long long dp[2][n][n],ans=0;
        for(int i=0;i<n;i++) dp[0][i][i]=dp[1][i][i]=nums[i];
        for(int i=1;i<n;i++){
            for(int j=1;j<=i;j++){
                dp[0][i][i-j]=min(dp[0][i-1][i-j],dp[0][i][i-j+1]);
                dp[1][i][i-j]=max(dp[1][i-1][i-j],dp[1][i][i-j+1]);
                ans+=dp[1][i][i-j]-dp[0][i][i-j];
            }
        }
        return ans;
    }
};

Problem C -

题意 给你一个整数数组,找出其所有子数组(连续)中有多少个公差为-1的等差数列。 思路 判断每一位和前一位是否符合”平滑下跌“,如是,记录长度+1,否则重新置1,这样每一位的len记录的是“以当前位置结束的平滑下跌阶段的数目”,每次累加即可,三行解决。 代码

class Solution {
public:
    long long getDescentPeriods(vector<int>& prices) {
        long long n=prices.size(),ans=1,len=1;
        for(int i=1;i<n;i++) len=(prices[i]==prices[i-1]-1)?len+1:1,ans+=len;
        return ans;
    }
};

Problem D -

题意 给定一个序列 { a 0 , a 1 , . . . , a n } {a_0,a_1,...,a_n} { a0,a1,...,an}和一个k,如果对于每个满足$ k le i le n-1$ 的下标 i ,都有 a r r [ i − k ] ≤ a r r [ i ] arr[i-k] le arr[i] arr[i−k]≤arr[i] ,那么我们称 arr 是 K 递增 的。问最少修改几个数能使序列满足"K 递增"。 思路 考虑以原数组的 a i ( 0 ≤ i ≤ k ) a_i(0 le i le k) ai(0≤i≤k)为首项,分成k组,例如:

a = [4, 1, 5, 2, 6, 2] , k = 2 可分为: { a 0 , a 2 , a 4 } { a 1 , a 3 , a 5 } {a_0,a_2,a_4}\ {a_1,a_3,a_5} { a0,a2,a4}{ a1,a3,a5}

这样问题转化为将某一个数组变成非递减序列的最少操作次数,对于这个问题显然想到经典LIS问题,其答案就是数组长度减去最长非递减子序列的长度。对于每个子问题答案累加,即得到本题答案。复杂度为 O ( k m l o g ( m ) ) , m = ( n / k ) O(k mlog(m)),m=(n/k) O(kmlog(m)),m=(n/k) 代码

#define INF 0x3f3f3f3f
class Solution {
public:
    int LIS(vector<int>& a){
        int n=a.size(),pos=1;
        int dp[n+1];
        fill(dp,dp+n+1,0);
        dp[1]=a[0];
        for(int i=1;i<n;i++){
            if(a[i]>=dp[pos]) dp[++pos]=a[i];
            else dp[upper_bound(dp+1,dp+pos+1,a[i])-dp]=a[i];
        }
        return n-pos;
    }
    int kIncreasing(vector<int>& arr, int k) {
        int n=arr.size(),ans=0;
        if(k>n) return 0;
        for(int i=0;i<k;i++){
            vector<int> tmp;
            for(int j=i;j<n;j+=k) tmp.push_back(arr[j]);
            ans+=LIS(tmp);
        }
        return ans;
    }
};
经验分享 程序员 微信小程序 职场和发展