2432.完成任务时间最长的员工 easy
题目理解:一个二位的向量表示工号、任务时间起点和终点,从里面找出任务时间最长的员工的工号
思路:类似数组求最大间距的索引,变化:索引值换成了二维数组的首位数,需要做判断取较小
class Solution {
public:
int hardestWorker(int n, vector<vector<int>>& logs) {
int hardester = logs[0][0];
int longestTime = logs[0][1];
for (int i = 1; i < logs.size(); i++) {
int tmp = logs[i][1] - logs[i - 1][1];
if(longestTime < tmp) {
longestTime = tmp;
hardester = logs[i][0];
} else if (tmp == longestTime && hardester > logs[i][0]) {
hardester = logs[i][0];
}
}
return hardester;
}
};
语法:根据是否需要索引值来选取相应的循环遍历语法糖,三种:类数组、auto类Java、iterator
49.字母异位词分组 medium
题目理解:把向量里的异位词分组。如:“eat”、“aet”、“tea”
思路1:异位词的本质是多个单词拥有相同种类和数量的字母,那么可以预处理出每个单词的字母种类和个数(利用char的unicode使用char数组),然后按顺序重新拼接每个单词,拼接词作为key构造map,map的value是vector向量。
思路2:直接利用c++容器的排序方法对每个单词排序,同时使用排序后的单词作为key构造map,同样map的value是vector向量。
思路2实现:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
// 两种思路:1.排序 2.预处理再排序
map<string, vector<string>> tmpMap;
for (vector<string>::iterator iter = strs.begin(); iter != strs.end(); iter++) {
string tmpStr = *iter;
sort(tmpStr.begin(), tmpStr.end());
tmpMap[tmpStr].emplace_back(*iter);
}
vector<vector<string>> result;
// 遍历tmpMap
for (auto &it : tmpMap) {
result.emplace_back(it.second);
}
return result;
}
};
语法:emplace_back和push_back比较,在左值情况下两者都需要拷贝复制,在右值情况下,emplace_back只需要移动拷贝,而push_back需要拷贝赋值+移动赋值,性能较低。
c++优化性能的本质是多用引用和指针,减少拷贝。那么就需要减少右值的拷贝,那么就出现了std::move,将右值变成右值引用。