54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
注意🚩:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
- 要判断是否越界
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//1.定义四个边界
List<Integer> list = new ArrayList<>();
//2.判断数组是否为空
if(matrix.length == 0) {
return list;
}
//3.定义上下左右四个边界
int left = 0,right = matrix[0].length - 1,top = 0,down = matrix.length - 1;
//4.循环遍历
while (true){
//5.从左到右
for(int i = left;i <= right;i++) {
list.add(matrix[top][i]);
}
//6.判断是否越界
if(++top > down) {
break;
}
//7.从上到下
for(int i = top;i <= down;i++) {
list.add(matrix[i][right]);
}
//8.判断是否越界
if(--right < left) {
break;
}
//9.从右到左
for(int i = right;i >= left;i--) {
list.add(matrix[down][i]);
}
//10.判断是否越界
if(--down < top) {
break;
}
//11.从下到上
for(int i = down;i >= top;i--) {
list.add(matrix[i][left]);
}
//12.判断是否越界
if(++left > right) {
break;
}
}
//13.返回list集合
return list;
}
}
27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
注意🚩:
- 不要使用额外的数组空间,你必须仅使用** O(1) **额外空间并 **原地 **修改输入数组。
- 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution {
public int removeElement(int[] nums, int val) {
//1.双指针
int i = 0,j = 0;
//2.遍历数组
for(;i < nums.length;i++)
if(nums[i] != val)
//3.将不等于val的元素放到数组前面
nums[j++] = nums[i];
//4.返回数组长度
return j;
}
}
24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
输入:head = [1,2,3,4] 输出:[2,1,4,3]
输入:head = [] 输出:[]
输入:head = [1] 输出:[1]
难点🚩:
- 注意节点的指向、顺序要弄清
class Solution {
public ListNode swapPairs(ListNode head) {
//1.创建一个虚拟头节点
ListNode dummy = new ListNode(0);
//2.将虚拟头节点指向head
dummy.next = head;
//3.创建一个临时节点,指向虚拟头节点
ListNode temp = dummy;
//4.遍历链表
while (temp.next != null && temp.next.next != null) {
//5.创建一个节点,指向temp的下一个节点
ListNode node1 = temp.next;
//6.创建一个节点,指向temp的下一个节点的下一个节点
ListNode node2 = temp.next.next;
//7.将temp的下一个节点指向node2的下一个节点
temp.next = node2;
//8.将node1的下一个节点指向node2的下一个节点
node1.next = node2.next;
//9.将node2的下一个节点指向node1
node2.next = node1;
//10.将temp指向node1
temp = node1;
}
//11.返回虚拟头节点的下一个节点
return dummy.next;
}
}