就这个题!!!!
我:
1 class Solution { 2 public: 3 vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) { 4 map<string,set<string>> m; 5 vector<string> ans; 6 for(int i=0;i<keyName.size();i++){ 7 m[keyName[i]].insert(keyTime[i]); 8 } 9 for(auto it=m.begin();it!=m.end();it++){ 10 if(it->second.size()<3) 11 continue; 12 13 auto it1 = it->second.begin(); 14 string time = *it1; 15 int prev = ((time[0]-'0')*10+time[1]-'0')*60+(time[3]-'0')*10+time[4]-'0'; 16 it1++; 17 time = *it1; 18 int mid = ((time[0]-'0')*10+time[1]-'0')*60+(time[3]-'0')*10+time[4]-'0'; 19 it1++; 20 for(;it1!=it->second.end();it1++){ 21 time=*it1; 22 int curr=((time[0]-'0')*10+time[1]-'0')*60+(time[3]-'0')*10+time[4]-'0'; 23 if(curr-prev<=60){ 24 ans.push_back(it->first); 25 break; 26 } 27 28 prev=mid; 29 mid=curr; 30 } 31 32 } 33 34 return ans; 35 } 36 };
就是,,,用Map每个名字存一下嘛,然后比较的时候,全化成分钟,然后用i和i-2比就行,然后前两个额话是单独搞就好(要不不太好整)
所以还是感觉STL是个好家伙,,,,,
不过我这个题写了四十多分钟emmmmmmmmm,主要原因就是 ,,,,,,,我,漏了一个等号,,,,后来找不到,看一个DL的题解才找到了bug
然鹅:
(选自https://www.cnblogs.com/Crossea/p/13766510.html)
1 class Solution { 2 public: 3 int convert(string s){ 4 5 return 60*((s[0]-'0')*10+s[1]-'0')+(s[3]-'0')*10+s[4]-'0'; 6 } 7 vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) { 8 // set<string> res; 9 vector<string> ans; 10 map<string, vector<int> > mp; 11 for(int i=0; i<keyName.size(); i++){ 12 mp[keyName[i]].push_back(convert(keyTime[i])); 13 } 14 for(auto e:mp){ 15 vector<int>& t = e.second; 16 sort(t.begin(), t.end()); 17 for(int i=0; i<t.size(); i++){ 18 auto pos = upper_bound(t.begin(), t.end(), t[i]+60); 19 if(distance(t.begin()+i, pos)>=3){ 20 ans.push_back(e.first); 21 break; 22 } 23 } 24 } 25 return ans; 26 } 27 };
其实也就差个十行,,,但是仔细一看,,,,每一行都是知识点。。。
首先是那个排序,,,我很服直接就把那个跨天给解决了(当时还觉得这一块需要什么判断啥的,其实根本就,,,,不过我后来直接作差大于0小于等于六十也可以的)
for each循环吗,,,,
还有就是最后那块,,,,,我感觉我无论怎么想,都会搞一个作差(甚至当时还像两个循环,像冒泡那样)
诶呀也该更新一下陈旧的大脑了
瞅瞅这位那个,是用upper_bound找到那个值,再用distance 算距离,两行QAQ
刚刚
交了一下,DL这款比我那款慢一些,但是也是双百,,,,,
呐呐呐呐呐,我咋就这么菜呀
第三题吗,我就直接不会了QAQ
copy内容:
注意到的是,对于矩阵的一个位置 ans[i][j]
这个数加上K也就是使得rowSum[i]和colSum[j]加上K
那么体现在从0开始的时候,也就是使得rowSum[i]和colSum[j]不小于0
那么从上往下直接取min(rowSum[i], colSum[j])即可
1 class Solution { 2 public: 3 vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) { 4 int n = rowSum.size(); 5 int m = colSum.size(); 6 vector<vector<int> > ans(n, vector<int> (m,0)); 7 for(int i=0; i<n; i++){ 8 for(int j=0; j<m; j++){ 9 ans[i][j] = min(rowSum[i], colSum[j]); 10 rowSum[i] -= ans[i][j]; 11 colSum[j] -= ans[i][j]; 12 } 13 } 14 return ans; 15 } 16 };
我跟大佬的区别呀,,,,,
努力让自己的能力跟大佬差距别那么惊人吧