Leetcode:Z 字形变换

题目链接:6. Z 字形变换 - 力扣(LeetCode)****

普通版本(二维矩阵的直接读写)

解决办法:直接依据题目要求新建并填写一个二维数组,最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并放到新数组中

分析1:当我们在矩阵上填写字符时,会先向下填写 r 个字符,然后向右上继续填写 r−2 个字符,最后回到第一行

结论1:Z 字形变换的周期 t = r + r − 2 = 2r − 2(一个残缺的斜着的v)*,每个周期会占用矩阵上的1 + (r - 2)= r − 1列*

结论2:总周期数 = n(总字符数)/ t(向上取整)总列数c = (n / t) * (r - 1)

结论3:新建二维数组的行数为r,列数为c

*填写操作:设当前填写的位置为(x,y),即矩阵的第 x 行的第 y 列,初始 (x,y)=(0,0)*(矩阵左上角)若当前字符下标 i 满足 i  mod  t < r − 1,则向下移动,否则向右上移动

cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
        int n = s.length(), r = numRows;
        if (r == 1 || r >= n) 
        {
            return s;
        }
        int t = r * 2 - 2;//一个周期中的个数
        //一个周期中的列数 = (r - 1)
        int c = (n + t) / t * (r - 1);//总列数 = 周期个数 * 一个周期的列数,周期个数 =  总个数 / 一个周期中的个数
        //如果总个数只是单纯的n的话,可能会导致不满一个周期的字符不被计算在内,且不被算在内的情况有多1、2、3个三种情况
        //而我们只需要在一个完整的总个数中再加上一个周期的个数即可,这样就可以将多出来的元素也算入一个新周期,尽管可能有空位但无所谓了
        vector<string> mat(r, string(c, 0));//创建一个r行、每行长度为c(即c列)的二维字符串数组mat,并初始化每个位置的字符为0
        
        for (int i = 0, x = 0, y = 0; i < n; ++i) //先从二维数组的左上角开始填写,先填写后判断下一次要填写的方向
        {
            //因为是先插入后判断的,所以判断时已经插入一个了,因此能继续向下移动的次数为r-1次
            mat[x][y] = s[i];
            if (i % t  < r - 1 ) //下标i是逐渐递增,因此要%t,重新映射原字符串中下标为i的字符在新周期中的位置(相当于在新周期中已经走了几次了)
            {//已经走的次数要小于该周期中向下可以走的次数-1,否则就是向右上走
                ++x; // 向下移动
            } 
            else
            {   
                --x;
                ++y; // 向右上移动
            }
        }
        string ans;
        //遍历二维数组,将非空的位置的字符插入新string
        for (auto &row : mat) 
        {
            for (char ch : row) 
            {
                if (ch) {
                    ans += ch;
                }
            }
        }
        return ans;
    }
};

时间复杂度:O(N)(创建数组的时间复杂度为O(r * c),填充数组的时间复杂度为O(N),构造最最终结果的时间复杂度为O(r * c),由于 r * cn 都是输入规模 n 的线性函数,我们可以认为时间复杂度是 O(n))

空间复杂度:O(N) string ans 用来存储结果字符串,占用了 O(n) 的空间**

优化版本(压缩矩阵空间,待补充)

优化版本(直接构造,待补充)

~over~

相关推荐
@小码农7 分钟前
202411 第十六届蓝桥杯青少组 STEMA 考试真题 汇总
职场和发展·蓝桥杯
古希腊掌管学习的神39 分钟前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca40 分钟前
洛谷 P1706 全排列问题 C语言
算法
古希腊掌管学习的神44 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
浊酒南街1 小时前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
ProcessOn官方账号1 小时前
如何绘制网络拓扑图?附详细分类解说和用户案例!
网络·职场和发展·流程图·拓扑学
学术头条1 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien2 小时前
图像处理-Ch4-频率域处理
算法
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法