给定一个包含mxn个元素的矩阵(m行,n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
分析:考虑单独一行或者单独一列的输出顺序。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
//难点是确定上下左右操作的边界
vector<int>res;
int n=matrix.size();//row
int m=matrix[0].size();
for(int i=0;i<(n+1)/2;i++)
{//只有一行时,需要上操作完成,只有一列时,需要上右操作
//shang
for(int j=i;j<m-i;j++)
res.push_back(matrix[i][j]);
//you
for(int j=i+1;j<n-i&&m-1-i>=i;j++)
res.push_back(matrix[j][m-1-i]);
//xia
for(int j=m-2-i;j>=i&&n-1-i>i;j--)
res.push_back(matrix[n-1-i][j]);
//zuo
for(int j=n-2-i;j>i&&i<m-1-i;j--)
res.push_back(matrix[j][i]);
}
return res;
}
};
给定一个正整数n,生成一个包含 1 到n2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
//比上道题简单些,套路一致。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n);
for(int i=0;i<n;i++)
res[i].resize(n);
int k=1;
for(int i=0;i<(n+1)/2;i++)
{
for(int j=i;j<n-i;j++)
res[i][j]=k++;
for(int j=i+1;j<n-i;j++)
res[j][n-1-i]=k++;
for(int j=n-2-i;j>=i;j--)
res[n-1-i][j]=k++;
for(int j=n-2-i;j>i;j--)
res[j][i]=k++;
}
return res;
}
};
给定一个链表,旋转链表,将链表每个节点向右移动k 个位置,其中k 是非负数。
分析:判断k是否超出节点个数,超出取余数,之后在循环过程,k次更新整个链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==nullptr||k==0)return head;
int num=0;
ListNode*p=head;
while(p!=nullptr)
{
num++;
p=p->next;
}
if(k>=num) k%=num;
int temp_pre,temp_cur;
while(k--)
{
p=head;
temp_pre=p->val;
while(p->next!=nullptr)
{
temp_cur=p->next->val;
p->next->val=temp_pre;
temp_pre=temp_cur;
p=p->next;
}
head->val=temp_pre;
}
return head;
}
};