leetcode第 295 场周赛


前言

这一次卡在了第二题上了w_w


6078. 重排字符形成目标字符串

题目详情

在这里插入图片描述

解题代码

短板效应

class Solution {
public:
    int st[100],cnt[100];
    int rearrangeCharacters(string s, string target) {
        for(int i=0;i<s.size();i++)
        {
            int t=s[i]-'a';
            st[t]++;
        }
        int minv=1000000;
        for(int i=0;i<target.size();i++)
        {
            int t=target[i]-'a';
            cnt[t]++;
        }
        for(int i=0;i<target.size();i++)
        {
            int t=target[i]-'a';
            minv = min(st[t]/cnt[t],minv);
        }
        
        return minv;
    }
};

6079. 价格减免

题目描述

在这里插入图片描述

解题代码

单纯的模拟题,double转string可以用sprintf,结尾的情况需要特判

class Solution {
public:
    int check(string s,int t,long long &res)
    {
        int i=1;
        while(t+i<s.size())
        {
            if(s[t+i]==' ' ) return i;
            if(s[t+i]<'0' || s[t+i]>'9') return 0;
            res=res*10+(s[t+i]-'0');
            i++;
        }
        return -1;
    }
    string discountPrices(string sentence, int discount) {
        string &s=sentence;
        string t;
        int cnt=0;
        for(int i=0;i<s.size();i++)
        {
            t+=s[i];
            if(s[i]=='$' &&(i==0 ||s[i-1]==' '))
            {
                long long res=0;
                int d=check(s,i,res);
                double ans;
                if(d>1 || d==-1) 
                {
                    
                    ans=(double)res*((100-discount)/100.0);
                    char str[20];
                    sprintf(str,"%.2f",ans);
                    if((d==-1 && res!=0) || d>1) 
                    {
                        t+=str;
                    }
                    // cout << d <<"--"<< res<<endl;
                    if(d!=-1) t+=' ';
 
                }
                if(d==1) t+=' ';
                cout <<i<<"-"<< d <<"--"<< res<<endl;
                if(d>0) i+=d;
                if(d==-1) break;
            }
        }
        puts("");
        return t;
    }
};

6080. 使数组按非递减顺序排列

题目详情

在这里插入图片描述

解题代码

一个单调栈问题


class Solution {
public:
    int totalSteps(vector<int>& nums) {
        int n=nums.size();
        stack<PII> stk;
        int ans=0;

        for(int i=0;i<n;i++)
        {
            int tmax=0;
            while(!stk.empty() && stk.top().first<=nums[i]) 
            {
                tmax=max(tmax,stk.top().second);
                stk.pop();
            }
            if(!stk.empty()) ++tmax;
            ans=max(ans,tmax);
            stk.push({nums[i],tmax});
            
        }
        return ans;     
    }
};

6081. 到达角落需要移除障碍物的最小数目

题目详情

在这里插入图片描述

解题代码

直接用dijkstra(每一次用最小的边跟新其他边)即可

class Solution {
public:
    typedef pair<int,int> PII ;
    typedef pair<int,PII> PIP ;
    int minimumObstacles(vector<vector<int>>& g) {
        int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
        int n=g.size(),m=g[0].size();
        int dist[n][m];
        memset(dist,0x3f,sizeof dist);
        priority_queue<PIP,vector<PIP>,greater<PIP>> h;
        dist[0][0]=0;
        h.push({0,{0,0}});

        while(h.size())
        {
            auto t=h.top().second;
            h.pop();
            auto x=t.first,y=t.second;
            for(int i=0;i<4;i++)
            {
                int nx=dx[i]+x,ny=dy[i]+y;
                if(nx < 0 || nx >=n || ny < 0 || ny >= m) continue;
                if(dist[nx][ny]>dist[x][y]+g[nx][ny])
                {
                    dist[nx][ny]=dist[x][y]+g[nx][ny];
                    h.push({g[nx][ny],{nx,ny}});
                }
            }
        }
        return dist[n-1][m-1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值