反转链表(递归、链表)、爬楼梯(记忆化搜索、数学)、旋转数组(数组、数学)

举报
共饮一杯无 发表于 2023/02/21 09:34:13 2023/02/21
【摘要】 反转链表(递归、链表)给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 输入:head = [1,2] 输出:[2,1] 输入:head = [] 输出:[]示例 1:示例 2:提示:链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000**进阶:**链表可以选用...

反转链表(递归、链表)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 输入:head = [1,2] 输出:[2,1] 输入:head = [] 输出:[]

示例 1:
image.png

示例 2:
image.png

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

解答:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        while (head != null) {
            ListNode tmp = head.next;
            head.next = pre;
            pre = head;
            head = tmp;
        }
        return pre;
    }
}

爬楼梯(记忆化搜索、数学)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
**注意:**给定 n 是一个正整数。
示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。1.  1+ 12.  2

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。1.  1+ 1+ 12.  1+ 23.  2+ 1

解答:

class Solution {
    public int climbStairs(int n) {
        int[] num = new int[n + 1];
        num[0] = 1;
        num[1] = 1;
        for (int i = 2; i <= n; i++) {
            num[i] = num[i - 1] + num[i - 2];
        }
        return num[n];
    }
}

旋转数组(数组、数学)

给定一个数组,将数组中的元素向右移动 k_ 个位置,其中 k _是非负数。

进阶:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 **原地 **算法解决这个问题吗?

示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 2 * 104
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

解答:

class Solution {
    public void rotate(int[] nums, int k) {
        if (k > nums.length) {
            k = k % nums.length;
        }
        int mark = nums.length - k;
        int mark2 = (nums.length + mark) / 2;
        for (int i = 0; i < (mark + 1) / 2; i++) {
            swap(nums, i, mark - 1 - i);
        }
        for (int j = mark; j < mark2; j++) {
            swap(nums, j, nums.length + mark - 1 - j);
        }
        for (int index = 0; index < nums.length / 2; index++) {
            swap(nums, index, nums.length - 1 - index);
        }
    }
    public static void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
保持热爱,奔赴下一场山海。🏃🏃🏃

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。