54.螺旋矩阵
题目描述:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
思路:按照螺旋矩阵的顺序进行循环即可。(将循环终止条件设置为result.Count=m*n)。
代码:
public class Solution
{
public IList<int> SpiralOrder(int[][] matrix)
{
int m = matrix.Length;
int n = matrix[0].Length;
List<int> result=new List<int>();
result.AddRange(matrix[0]);
int count = 0;
while (result.Count<m*n)
{
for (int i = 1+count; i < m-count; i++)
{
if (result.Count < m * n)
result.Add(matrix[i][n - 1-count]);
}
for (int i = n - 2-count; i > -1+count; i--)
{
if (result.Count < m * n)
result.Add(matrix[m - 1-count][i]);
}
for (int i = m - 2-count; i > 0+count; i--)
{
if (result.Count < m * n)
result.Add(matrix[i][count]);
}
for (int i = 1+count; i < n - 1-count; i++)
{
if (result.Count < m * n)
result.Add(matrix[1+count][i]);
}
count++;
}
return result;
}
}
59.螺旋矩阵II
题目描述:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
思路:和54题思路一致,对代码稍作修改。
public class Solution
{
public int[][] GenerateMatrix(int n)
{
int[][] result=new int[n][];
for (int i = 0; i < n; i++)
result[i] = new int[n];
for (int i = 0; i < n; i++)
result[0][i] = i + 1;
int temp=n+1;
int count = 0;
while (temp<n*n+1)
{
for (int i = 1 + count; i < n - count; i++)
{
if (temp < n * n + 1)
{
result[i][n - 1 - count]=temp;
temp++;
}
}
for (int i = n - 2 - count; i > -1 + count; i--)
{
if (temp < n * n + 1)
{
result[n - 1 - count][i]=temp;
temp++;
}
}
for (int i = n - 2 - count; i > 0 + count; i--)
{
if (temp < n * n + 1)
{
result[i][count]=temp;
temp++;
}
}
for (int i = 1 + count; i < n - 1 - count; i++)
{
if (temp < n * n + 1)
{
result[1 + count][i]=temp;
temp++;
}
}
count++;
}
return result;
}
}
61.旋转链表
题目描述:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
思路:本题如果一个结点一个结点的移动会超出时间限制,只需对k做简单讨论,找到最终的头结点,将该结点及其之和的结点全部放到原头结点的前面即可。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution
{
public ListNode RotateRight(ListNode head, int k)
{
if (head == null || k == 0 || head.next == null)
return head;
int len=1;
ListNode b=head;
while (b.next != null)
{
b = b.next;
len++;
}
k = k % len;
if(k==0)
return head;
ListNode i=head;
ListNode j=head.next;
for(int t=0;t<len-k-1;t++)
{
j = j.next;
i = i.next;
}
b.next=head;
head=j;
i.next=null;
return head;
}
}