题目:54. 螺旋矩阵
来源:力扣(LeetCode) https://leetcode-cn.com/problems/spiral-matrix/
【中等】给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
输入:
[ [ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]]
输出: [1,2,3,6,9,8,7,4,5]
解题思路
模拟螺旋的遍历行为,分为向右、向下、向左、向上方向的遍历。
1、记录上下左右4个边界值。
2、令计数作为循环条件,相对于左右边界做判断,这样处理不容易出错。
3、通过for循环遍历完每个方向的所有值,相对于if做判断更不容易出错。
4、更新边界。
执行代码
import java.util.*;
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int left = 0, top = 0;
int bottom = matrix.length-1;
int right = matrix[0].length-1;
int num = matrix.length*matrix[0].length; //计数
List<Integer> result = new ArrayList<>();
while (num >= 1) {
for (int i = left; i <= right && num >= 1; i++) { //向右遍历到底
result.add(matrix[top][i]);
num--;
}
top++;
for (int i = top; i <= bottom && num >= 1; i++) { //向下遍历到底
result.add(matrix[i][right]);
num--;
}
right--;
for (int i = right; i >= left && num >= 1; i--) { //向左遍历到底
result.add(matrix[bottom][i]);
num--;
}
bottom--;
for (int i = bottom; i >= top && num >= 1; i--) { //向上遍历到底
result.add(matrix[i][left]);
num--;
}
left++;
}
return result;
}
}
复杂度
时间复杂度:O(m * n)
空间复杂度:O(1 )
题目:59. 螺旋矩阵 II
来源:力扣(LeetCode)https://leetcode-cn.com/problems/spiral-matrix-ii/
【中等】给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
思路
与上题思路一致,代码也几乎一致,反着写即可。
题目:61. 旋转链表
https://leetcode-cn.com/problems/rotate-list/
【中等】给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
思路
方法一:用链表记录全部值,再为节点赋新值。关键为遍历的表达式。i+(len-k%len))%len
方法二:转换为循环链表,返回新头节点,再断尾。
方法一 - 执行代码
import java.util.*;
class Solution {
public ListNode rotateRight(ListNode head, int k) {
ArrayList<Integer> list = new ArrayList<Integer>();
ListNode node = head;
while(node!=null){
list.add(node.val);
node = node.next;
}
node = head;
int len = list.size();
for(int i = 0;i<len;i++){
node.val = list.get(i+(len-k%len))%len); //赋与新索引的值
node = node.next;
}
return head;
}
}
复杂度
时间复杂度:O( n )
空间复杂度:O( n )
方法二 - 执行代码
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null)
return null;
ListNode node = head;
int len = 1;
while(node.next!=null){
node = node.next;
len++;
}
node.next = head; //尾结点指向头
for(int i =0;i<(len-k%len)%len;i++){
node = node.next; //找新尾
}
head = node.next; //新头
node.next = null; //断尾
return head;
}
}
复杂度
时间复杂度:O( n )
空间复杂度:O(1)