LeetCode 热题100 -54、27、24

112 阅读2分钟

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 image.png

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

输出:[1,2,3,6,9,8,7,4,5]

image.png

输入: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. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 image.png

输入: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;
    }
}