算法刷题计划(十四)旋转图像、字母异位词分组、分发糖果、分发饼干

22 篇文章 0 订阅
20 篇文章 0 订阅

一、旋转图像

  • 题目:
    在这里插入图片描述

  • 题解:

  • 方法一(“复制粘贴”方法);

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值