一、旋转图像
-
题目:
-
题解:
-
方法一(“复制粘贴”方法);
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int m=matrix.size(),n=matrix[0].size();
vector<vector<int>>copy(m,vector<int>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
copy[j][n-i-1]=matrix[i][j];
}
}
matrix=copy;
}
};
- 方法二(水平翻转后再对线翻转):
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 水平翻转
for (int i = 0; i < n / 2; ++i) {
for (int j = 0; j < n; ++j) {
swap(matrix[i][j], matrix[n - i - 1][j]);
}
}
// 主对角线翻转
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
}
}
};
二、字母异位词分组
-
题目(字母异位词是指字母位置不一样但该字母数量一样):
-
题解:
-
方法一(排序+哈希):
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>>res;
map<string,vector<string>>mp;
for(int i=0;i<strs.size();i++){
string str=strs[i];
sort(str.begin(),str.end());
mp[str].emplace_back(strs[i]);
}
for(const auto&s:mp){
res.emplace_back(s.second);
}
return res;
}
};
- 方法二(数字+哈希):
vector<vector<string>> groupAnagrams(vector<string>& strs) {
map<string,vector<string>>mp;
vector<vector<string>>res;
for(const auto s:strs){
string str=string(26,'0');
for(const auto s1:s)
str[s1-'a']++;
mp[str].emplace_back(s);
}
for(const auto s:mp){
res.emplace_back(s.second);
}
return res;
}
三、分发糖果
-
题目:
-
题解:
-
方法一(两次遍历(左右各一次)):
class Solution {
public:
int candy(vector<int>& ratings) {
int n=ratings.size();
vector<int>left(n);
for(int i=0;i<n;i++){
if(i>0&&ratings[i]>ratings[i-1]){
left[i]=left[i-1]+1;
}else{
left[i]=1;
}
}
int right=0,sumMin=0;
for(int i=n-1;i>=0;i--){
if(i<n-1&&ratings[i]>ratings[i+1]){
right++;
}
else{
right=1;
}
sumMin+=max(left[i],right);
}
return sumMin;
}
};
四、分发饼干
- 题目:
- 题解:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());sort(s.begin(),s.end());
int person=0;
for(int i=0;i<s.size();i++){
if(s[i]<g[person]) continue;
person++;
if(person==s.size()||person==g.size()) break;
}
return person;
}
};