leetcode 6 Z字形变化

一、题目描述

二、解题思路

解法一

构造二维向量,模拟Z字填写。实例填写后的二维向量如图所示:

解法二

整体思路

根据解法一模拟 过程,寻找下标规律 。

具体思路

例如,当numRows=4时,通过观察每一行下标之间的关系我们可以知道:

(1)第0行和第numRows行后一个下标与前一个下标的差为2*numRows-2,设这个值为d(公差),

下标规律为:

k,k+d,k+2d,k+3d......

(2)中间第k行可以两个组成一组,其下标规律为:

(k,d-k),(k+d,(d-k)+d),(k+2d,(d-k)+2d)......

三、代码实现

解法一

时间复杂度:T(n)=O(m*n)

空间复杂度:S(n)=O(m*n)

cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
        //边界处理
        if(numRows==1||s.size()<=numRows) return s;
        //申请二维向量,模拟Z字填写
        vector<vector<char>> z_board(numRows,vector<char>(s.size(),'0'));
        //填写二维向量
        int num=0,row=0,line=0;
        while(num!=s.size()){
            //向下填写
            while(row<numRows&&num!=s.size()){
                z_board[row][line]=s[num];
                num++;row++;
            }
            row-=2;line++;
            //向右上填写
            while(row>0&&num!=s.size()){
                z_board[row][line]=s[num];
                num++;row--;line++;
            }
        }
        //构造需要返回的字符串
        string ret;
        for(int i=0;i!=numRows;i++)
            for(int j=0;j!=s.size();j++)
                if(z_board[i][j]!='0')
                    ret+=z_board[i][j];
        return ret;
    }
};

解法二

时间复杂度:T(n)=O(n)

空间复杂度:S(n)=O(1)

cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
        //根据模拟填写,观察下标规律
        //边界处理
        if(numRows==1||s.size()<=numRows) return s;
        //计算公差d
       int d=2*numRows-2;
       string ret;
       for(int row=0;row!=numRows;row++){
        //如果为第0行或者第numRows-1行
        if(row==0||row==numRows-1)
            for(int left=row;left<s.size();left+=d)
                ret+=s[left];
        //如果为中间第k行
        else {
            for(int left=row,right=d-row;left<s.size()||right<s.size();left+=d,right+=d){
                if(left<s.size())
                    ret+=s[left];
                if(right<s.size())
                    ret+=s[right];
            } 
        }
       }
       return ret;
    }
};
相关推荐
蹊黎3 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
强哥聊算力5 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
西柚小萌新8 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
小 黄 鸡8 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
Navigator_Z9 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy9 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
mmmmath_310 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
xier_ran10 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
YangYang9YangYan11 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl211 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法