腾讯精选50题—Day7题目54,59,61

本文提供三道经典算法题目的解析及代码实现:螺旋矩阵、螺旋矩阵II与旋转链表。详细介绍了每道题目的解题思路及算法实现,并附带时间与空间复杂度分析。

腾讯精选50题—Day7题目54,59,61

  今天是刷题的第七天,元气满满的周一~~

1. 题目54 螺旋矩阵

(1) 题目描述

在这里插入图片描述
在这里插入图片描述

(2) 思路

  螺旋矩阵的问题比较简单,只要定好四个位置即可,lx、rx、by、ty,按照绿色箭头顺序遍历,在遍历的过程中保证lx不能大于rx同时by不能大于ty。
在这里插入图片描述

(3) 题解

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {

        int lx = 0;
        int rx = matrix[0].size() - 1;
        int by = 0;
        int ty = matrix.size() - 1;
        
        int number = matrix[0].size() * matrix.size();
        vector<int> result;

        while(true)
        {
            if (lx > rx || by > ty)
                break;
            for (int i = lx; i <= rx; i++)
                result.push_back(matrix[by][i]);
            by++;
            if (lx > rx || by > ty)
                break;
            for (int j = by; j <= ty; j++)
                result.push_back(matrix[j][rx]);
            rx--;
            if (lx > rx || by > ty)
                break;
            for (int k = rx; k >= lx; k--)
                result.push_back(matrix[ty][k]);
            ty--;
            if (lx > rx || by > ty)
                break;
            for (int t = ty; t >= by; t--)
                result.push_back(matrix[t][lx]);
            lx++;

        }
        return result;
    }
};

结果:
在这里插入图片描述
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

2. 题目59 螺旋矩阵II

(1) 题目描述

在这里插入图片描述

(2) 思路

  思路和54题类型,先声明一个空的矩阵,然后填数字。

(3) 题解

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

        vector<vector<int>> result(n, vector<int>(n, 0));

        int lx = 0;
        int rx = n - 1;
        int by = 0;
        int ty = n - 1;

        int num = 1;
        while (true)
        {
            if (lx > rx || by > ty)
                break;
            for (int i = lx; i <= rx; i++)
            {
                result[by][i] = num;
                num++;
            }
            by++;
            if (lx > rx || by > ty)
                break;
            for (int j = by; j <= ty; j++)
            {
                result[j][rx] = num;
                num++;
            }
            rx--;
            if (lx > rx || by > ty)
                break;
            for (int k = rx; k >= lx; k--)
            {
                result[ty][k] = num;
                num++;
            }
            ty--;
            if (lx > rx || by > ty)
                break;
            for (int t = ty; t >= by; t--)
            {
                result[t][lx] = num;
                num++;
            }
            lx++;
        }

        return result;
    }
};

结果:
在这里插入图片描述
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

3. 题目61 旋转链表

(1) 题目描述

在这里插入图片描述

(2) 思路

  先成环,后断链。

(3) 题解

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {

        if (k == 0)
            return head;

        ListNode* p = head;
        ListNode* tail = NULL;
        int len = 0;
        while (p != NULL)
        {
            if (p->next == NULL)
                tail = p;

            p = p->next;
            len++;
            
        }
        if (len == 0) return NULL;
        int new_k = k % len;

        tail->next = head;
        p = tail;

        int move_step = len - new_k;

        while (move_step > 0)
        {
            p = p->next;
            move_step--;
        }
        ListNode* result = p->next;
        p->next = NULL;

        return result;
    }
};

结果:
在这里插入图片描述

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值