2020-08-31刷题

  1. leetcode-841-钥匙和房间
    题型:深优、递归
    难度:中等
    题目:有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。
    在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。
    最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 true,否则返回 false。
    代码:
class Solution {
private:
    int count;
public:
    void dfs(vector<vector<int>>& rooms,vector<bool> &vec,int n){
        //把当前房间置为真
        vec[n] = true;
        //已打开的房间总数加1
        count++;
        //遍历这个房间里所有的钥匙,如果这个房间没处理过,继续处理
        for(auto i:rooms[n])
        {
            if(vec[i] == false)
            {
                dfs(rooms,vec,i);
            }
        }
    }
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        int len = rooms.size();
        vector<bool> vec(len,false);
        vec[0] = true;
       // count = 1;
        dfs(rooms,vec,0);

        if(count == len)
            return true;
        return false;
    }
};
  1. leetcode-557-反转字符串中的单词3
    题型:字符串
    难度:简单
    题目:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
    代码:
class Solution {
public:
    string reverseWords(string s) {
        string resstr = "";
        string curstr = "";
        for(int i=s.size()-1;i>=0;i--)
        {
            if(s[i] != ' ')
            {
                curstr += s[i];
            }
            else
            {
                curstr = " "+curstr;
                resstr = curstr+resstr;
                curstr = "";
            }
        }
        //此时curstr可能不为空,那说明还没拼接
        if(curstr != "")
            resstr = curstr+resstr;

        return resstr;
    }
};
  1. leetcode-474-一和零
    题型:动态规划、01背包
    难度:中等
    题目:在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。
    你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。
    代码:
//遍历每个字符串,记录0和1出现的总个数。
//满足这种情况时候,0和1总量必定大于或等于这个字符串的总数,看所有满足条件的情况
//那么遍历所有满足条件的情况,加或者不加当前情况,选择收益(符合条件的字符串)较大的。
class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        int nlen = strs.size();
        vector<vector<int> > vec(m+1,vector<int>(n+1,0));
        for(int i=0;i<nlen;i++)
        {
            int num0 = 0;
            int num1 = 0;
            int strlen1 = strs[i].size();
            for(int j=0;j<strlen1;j++)
            {
                if(strs[i][j] == '0')
                    num0++;
                if(strs[i][j] == '1')
                    num1++;
            }
            //遍历满足条件的所有情况
            for(int a=m;a>=num0;a--)
            {
                for(int b=n;b>=num1;b--)
                {
                    vec[a][b] = max(vec[a][b],vec[a-num0][b-num1]+1);
                }
            }
        }
        return vec[m][n];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值