栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Leetcode 第270场周赛题解(C++版) Problem A - 环和杆

题意
给10个杆子和3种环,问套了三种颜色环的杆子有多少
思路
按题意模拟,10个set解决,同时注意给定字符串长度是 2 n 2n 2n。
代码

class Solution {
public:
    int countPoints(string rings) {
        set ans[10];
        int n=rings.size();
        for(int i=0;2*i 
Problem B - 子数组范围和(https://leetcode-cn.com/problems/sum-of-subarray-ranges/) 

题意
求所有连续子数组的"最大值-最小值"之和。
思路
按题意模拟,dp[0][i][j]和dp[1][i][j]分别表示i~j这段子数组的最大值和最小值。
显然有
d p [ 0 ] [ i ] [ i − j ] = m i n ( d p [ 0 ] [ i − 1 ] [ i − j ] , d p [ 0 ] [ i ] [ i − j + 1 ] ) ; d p [ 1 ] [ i ] [ i − j ] = m a x ( d p [ 1 ] [ i − 1 ] [ i − j ] , d p [ 1 ] [ i ] [ i − j + 1 ] ) ; 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]); 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]);
由此便可 O ( n 2 ) O(n^2) O(n2)地解决该问题
代码

class Solution {
public:
    long long subArrayRanges(vector& nums) {
        int n=nums.size();
        long long dp[2][n][n],ans=0;
        for(int i=0;i 
Problem C - 给植物浇水 II 

题意
两个人分别从左边右边同时给n棵植物浇水,每人壶的最大容量为A和B,如果不能完全浇灌下一个植物,就要一直加水直至能够完全浇灌为止,如果两人此刻同时浇灌一颗植物,谁剩的水多谁浇,如果剩的一样多A浇,问总共加水多少次。
思路
按题意模拟,答案显然,注意处理遇见同一颗植物的分类讨论。
代码

class Solution {
public:
    int minimumRefill(vector& p, int a, int b) {
        int ans=0,n=p.size();
        int l=0,r=n-1;
        int A=a,B=b;
        while(l<=r){
            if(l==r){
                if(a>=b){
                    while(a 
Problem D - 摘水果 

题意
给定数轴上的一些点,这些点上有一些水果,经过此点就可收获此点上所有水果,水果不可再生,从某个给定点出发,最多走k步,问最多能收获多少水果。
思路
简单来说,本题只有两种情况,向一侧一直走k步,或者是先向一侧走i步,往回再走i步回到起点,再向另一侧走 k − 2 i k-2i k−2i步。由此,我们可以处理出向左/向右走1~k步的答案,再处理折返的情况,这种情况下,我们假定终点为起点向左/向右偏移 i ( i ∈ [ 1 , k ] ) i(i in [1,k] ) i(i∈[1,k])步,并强制其先往另一侧走 ( k − i ) / 2 (k-i)/2 (k−i)/2步,注意去掉起点处的水果数量,会重复计算一次。
代码

class Solution {
public:
    unordered_map ma;
    int maxTotalFruits(vector>& fruits, int startPos, int k) {
        int n=fruits.size();
        int dp[2][k+1];//dp[0][i]和dp[1][i]分别表示向左/向右走i步能获得的水果数量
        for(int i=0;i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号