Task07

本文链接:https://blog.csdn.net/qq_34811382/article/details/112793705

054.螺旋矩阵

在这里插入图片描述
思路:

按照题目要求,一圈一圈的往里遍历**

代码:

class Solution {
    
    
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
    
    
        if(matrix.empty() || matrix[0].empty()) return {
    
    };
        vector<int> res;
        int m = matrix.size(), n = matrix[0].size();
        // 确定上下左右四条边的位置
        int up = 0, down = m - 1, left = 0, right = n - 1;
        while (true)
        {
    
     
            for (int i = left; i <= right; i++) res.push_back(matrix[up][i]);
            if (++up > down) break;
            for (int i = up; i <= down; i++) res.push_back(matrix[i][right]);
            if (--right < left) break;
            for (int i = right; i >= left; i--) res.push_back(matrix[down][i]);
            if (--down < up) break;
            for (int i = down; i >= up; i--) res.push_back(matrix[i][left]);
            if (++left > right) break;
        }
        return res;
    }
};

在这里插入图片描述

59.螺旋矩阵Ⅱ

在这里插入图片描述

思路:

一圈一圈添加,注意边界

代码:

class Solution {
    
    
public:
    vector<vector<int>> generateMatrix(int n) {
    
    
        //vector<vector<int>> res;
        vector<vector<int>> res(n, vector<int>(n, 0));
        if (n == 0) return res;
        int num = 1;
        int left = 0, right = n - 1;
        int low = 0, hight = n - 1;
        while (left <= right && low <= hight) {
    
    
            for (int i = left; i <= right; i++) {
    
    
                res[low][i] = num++;
            }
            low++;
            if (low > hight) break;// 边界在判断一下
            for (int i = low;i <=hight; i++ ) {
    
    
                res[i][right] = num++;
            }
            right--;
            if (right < left) break; // 边界在判断一下
            for (int i = right;i >=left;i--) {
    
    
                res[hight][i] = num++;
            }
            hight--;
            for (int i = hight;i >= low; i--) {
    
    
                res[i][left] = num++;
            }
            left++;
        }
        return res;
    }
};

在这里插入图片描述

61.循环链表

扫描二维码关注公众号,回复: 12393866 查看本文章

思路:

第一步:构建一个循环链表
第二步:找到n=list_len-k%list_len(说明:因为题中未给k与链表长度list_len的大小。所以取模做差)
第三步:在n处断开链表环

代码:

class Solution
{
    
    
public:
    ListNode *rotateRight(ListNode *head, int k)
    {
    
    
        if (head == nullptr || k == 0 || head->next == nullptr)
            return head;
        ListNode *Circle = head;
        int list_len = 1;
        while (Circle->next)
        {
    
    
            Circle = Circle->next;
            list_len++;
        }
        Circle->next = head;//这里形成一个链表环
        k = list_len - k % list_len;
        Circle = head;
        for (int i = 0; i < k - 1; i++)
        {
    
    
            Circle = Circle->next;
        }
        head = Circle->next;//这里断开链表环
        Circle->next = nullptr;
        return head;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34811382/article/details/112793705