Leetcode 字符串及数组

目录

 

区间类问题

分割数组/字符串

原地旋转矩阵

48. 旋转图像

54. 螺旋矩阵


区间类问题

 

Leetcode区间类问题:https://blog.csdn.net/qq_41605114/article/details/106718697

 

分割数组/字符串

5458. 字符串的好分割数目 https://leetcode-cn.com/problems/number-of-good-ways-to-split-a-string/

class Solution {
public:
    int numSplits(string s) {
        //两个Hash表 巧妙的是一个Hash先将全部内容遍历一遍,将内容压入,然后从头开始遍历,
        unordered_map<char,int>M1,M2;
        for(auto item:s) M2[item]++;//完全不分割
        int res = 0;
        for(int len = 0;len<s.size();++len){
            M1[s[len]]++;//不断扩张
            M2[s[len]]--;//不断收缩
            int size1 = 0,size2 = 0;
            //判断元素的个数  最多循环26次
            for(auto item:M1) if(item.second>0) size1++;
            for(auto item:M2) if(item.second>0) size2++;
            if(size1 == size2) res++;
        }
        return res;
    }
};

原地旋转矩阵

48. 旋转图像

https://leetcode-cn.com/problems/rotate-image/

本题还是需要观察一下,才能入手的

不能整行的换,下面是本题代码思路的示意图:

两个两个换,才能整个完成选择

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        if(matrix.empty()) return;
        int row = matrix.size(),col = matrix[0].size();
        //从外到内进行替换
        int BeginR = 0,EndR = row-1;
        int BeginC = 0,EndC = col-1;
        while(BeginR<EndR)
        {
            //换四个角
            //顶行和左列
            for(int i = EndR,j = BeginC;i>BeginR,j<EndC;--i,++j)
            {
                swap(matrix[BeginR][j],matrix[i][BeginC]);//第一行和第一列交换
            }
            //左列和底行
            for(int i = EndR,j = EndC;i>BeginR,j>BeginC;--i,--j)
            {
                swap(matrix[i][BeginC],matrix[EndR][j]);//第一行和第一列交换
            }  
            //左列和底行
            for(int i = EndR-1,j = BeginC+1;i>=BeginR,j<=EndC;--i,++j)
            {
                swap(matrix[EndR][j],matrix[i][EndC]);//第一行和第一列交换
            } 
            //收缩     
            BeginR++;EndR--;BeginC++;EndC--;  
            cout<<BeginR<<""<<endl; 
        }
        
    }
};

54. 螺旋矩阵

https://leetcode-cn.com/problems/spiral-matrix/

面试题29. 顺时针打印矩阵  https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/

本题没有任何花里胡哨的技巧等,就是单纯的模拟整个过程,思路要清晰

 

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.empty()) return{};
        int m = matrix.size(),n = matrix[0].size();
        int Rbegin = 0,Rend = m-1;
        int Cbegin = 0,Cend = n-1;
        vector<int> Res;
        while(Rbegin!=Rend||Cbegin!=Cend)
        {
            //第一行
            for(int i = Cbegin;i <= Cend;++i) 
            if( (i>=0&&i<n&&Rbegin<m)&&matrix[Rbegin][i] != INT_MIN)//固定行
            {Res.push_back(matrix[Rbegin][i]);matrix[Rbegin][i] = INT_MIN;}

            //右侧
            for(int i = Rbegin;i<= Rend;++i) 
            if((i>=0&&i<m&&Cend>=0)&&matrix[i][Cend] != INT_MIN)//固定列
            {Res.push_back(matrix[i][Cend]);matrix[i][Cend] = INT_MIN;}

            if(Cbegin!=Cend) Cend--;
            if(Rbegin!=Rend) Rbegin++;
            //下侧
            for(int i = Cend;i>=Cbegin;--i) 
            if((i>=0&&i<n&&Rend>=0)&&matrix[Rend][i] != INT_MIN)//固定行
            {Res.push_back(matrix[Rend][i]);matrix[Rend][i] = INT_MIN;}

            if(Rbegin!=Rend) Rend--;
            //左侧
            for(int i = Rend;i>=Rbegin;--i) 
            if((i>=0&&i<m&&Cbegin<m)&&matrix[i][Cbegin] != INT_MIN)//固定列
            {Res.push_back(matrix[i][Cbegin]);matrix[i][Cbegin] = INT_MIN;}
            if(Cbegin!=Cend) Cbegin++;

        }
        // cout<<"Rbegin"<<Rbegin<<endl;
        // cout<<"Rend"<<Rend<<endl;
        // cout<<"Cbegin"<<Cbegin<<endl;
        // cout<<"Cend"<<Cend<<endl;
        if(matrix[Rbegin][Cbegin] != INT_MIN)
        Res.push_back(matrix[Rbegin][Cbegin]);
        return Res;
        
    }
};

 

724. 寻找数组的中心索引 https://leetcode-cn.com/problems/find-pivot-index/

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        if(nums.empty()) return -1;
        int Right = 0,Left = 0;
        for(auto item:nums) Right += item;
        for(int i = 0;i<nums.size();++i){
            Right -= nums[i];
            // cout<<Left<<" "<<Right<<endl;
            if(Left == Right) return i;
            Left += nums[i];
        }
        return -1;

    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值