LeetCode日记20200209

LeetCode日记2020.2.9


今天第一次参加周赛,结果就遇上了第三道题的“线 上 事 故”,(╯‵□′)╯︵┴─┴
只做了前3道题,后面一道题自己的level还不够,结束后直接看的大神的题解。

5332 检查整数及其两倍数是否存在(easy)

送分题

class Solution {
public:
    bool checkIfExist(vector<int>& arr) {
        for(int i=0;i<arr.size();++i)
        {
            int a = arr[i];
            for(int j=i+1;j<arr.size();++j)
            {
                if(2*a == arr[j] || 2*arr[j] == a)
                    return true;
            }
        }
        return false;
    }
};

5333 制造字符异位词的最小步数(mid)

class Solution {
public:
    int minSteps(string s, string t) {
        int sMap[26], tMap[26];
        memset(sMap, 0, sizeof(sMap));
        memset(tMap, 0, sizeof(tMap));
        for(int i=0;i<s.size();++i)
        {
            ++sMap[s[i]-'a'];
            ++tMap[t[i]-'a'];
        }
        int a = 0;
        for(int i=0;i<26;++i)
        {
            if(tMap[i] > sMap[i])
                a+=tMap[i]-sMap[i];
        }
        return a;
    }
};

1348 推文计数(mid)

线 上 事 故
这道题大概考的是快速理解题意吧,难度并不高。

class TweetCounts {
public:
    TweetCounts() {
        
    }
    
    void recordTweet(string tweetName, int time) {
        tMap[tweetName].insert(time);
    }
    
    vector<int> getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime) {
        int delta;
        if(freq == "day")
            delta = 3600 * 24;
        else if(freq == "hour")
            delta = 3600;
        else
            delta = 60;
        
        vector<set<int>::iterator> endPts;
        vector<int> res(ceil((endTime + 1 - startTime) / double(delta)), 0);
        auto iter = tMap.find(tweetName);
        if(iter == tMap.end())
            return res;

        while(startTime < endTime + 1)
        {
            endPts.push_back(iter->second.lower_bound(startTime));
            startTime += delta;
        }
        endPts.push_back(iter->second.lower_bound(endTime + 1));

        for(int i=0; i<endPts.size()-1; ++i)
        {
            for(auto iter=endPts[i];iter!=endPts[i+1];++iter)
            {
                ++res[i];
            }
        }
        return res;
    }
    
    map<string, set<int>> tMap;
};

/**
 * Your TweetCounts object will be instantiated and called as such:
 * TweetCounts* obj = new TweetCounts();
 * obj->recordTweet(tweetName,time);
 * vector<int> param_2 = obj->getTweetCountsPerFrequency(freq,tweetName,startTime,endTime);
 */

5335 参加考试的最大学生数(hard)

考虑处理大数据的话显然需要图论的知识了,非科班没搞过ACM,就算了。
但是官方显然为了降低难度,减小了数据量并暗示我们用动态规划,参考了johnkram的代码,自己实现了一下,对动态规划有了更深的理解。
突然发现求0到某正整数各自的二进制表示中有多少个1这个问题居然也是个动态规划问题并且可以非常简洁优美地实现。

class Solution {
public:
    int maxStudents(vector<vector<char>>& seats) {
        int m = seats.size(), n=seats.front().size();
        int cnts[256];
        cnts[0] = 0;
        // 我佛了
        for(int i=1; i<256; ++i)
        {
            cnts[i] = cnts[i>>1] + (i&1);
        }

        int badsit[8];
        memset(badsit, 0, sizeof(badsit));
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                if(seats[i][j] == '#')
                    badsit[i] |= 1<<j;
            }
        }

        int dp[9][256];
        memset(dp, 0, sizeof(dp));
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<1<<n;++j)
            {
                if(!(j&badsit[i]) && !(j&j<<1) && !(j&j>>1))
                {
                    for(int k=0;k<1<<n; ++k)
                    {
                        if(!(j&k<<1) && !(j&k>>1))
                        {
                            dp[i+1][j] = max(dp[i+1][j], dp[i][k] + cnts[j]);
                        }
                    }
                }
            }
        }
        int ans = dp[m][0];
        for(int i=1;i<1<<n;++i)
            ans = max(ans, dp[m][i]);

        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值