本文链接: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.循环链表
思路:
第一步:构建一个循环链表
第二步:找到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;
}
};