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;
}
};