下一个排列
题目整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。 给你一个整数数组 nums ,找出 nums 的下一个排列。 必须 原地 修改,只允许使用额外常数空间。 思路这道题目其实是 Hot100 系列题目比较有独特思想的,主要有两个重点。 下一个排列的实现可以分为以下几个步骤: 从右...
LeetCode 链表交换节点问题(24、25题)
本文将详细讲解 LeetCode 中两道经典的链表节点交换问题: 第 24 题:两两交换链表中的节点 第 25 题:K 个一组翻转链表 这两道题都属于链表操作的经典题目,考察了对链表指针操作的掌握程度,以及递归或迭代思想的应用。 24. 两两交换链表中的节点题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 12输入:head = [1,2,3,4]输出:[2,1,4,3] 提示: 链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100 解题思路这道题的最优解法是使用 迭代 方法,通过维护几个关键指针来实现两两节点的交换。 核心思路: 使用一个虚拟头节点(dummy node)简化边界情况处理 维护一个当前指针 curr,用于遍历链表 每次交换 curr 后面的两个节点 更新指针位置,继续下一轮交换 算法步骤: 创建虚拟头节点 dummy,使其指向原链表头 初始化当前指针 curr 指向 dummy 当 curr 后面有至少两个节点时...
接雨水问题-11、42
参考题目42. 接雨水 42. 接雨水 | 力扣 | LeetCode | 🔴 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 12输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2:12输入:height = [4,2,0,3,2,5]输出:9 提示: n == height.length 1 <= n <= 2 * 10⁴ 0 <= height[i] <= 10⁵ 解法暴力解法 → 备忘录解法 → 双指针解法 暴力解法-核心思路仅仅考虑位置 i 这一个位置能装下多少水? 能装 2 格水,为什么位置 i 最多能盛 2 格水呢?因为,位置 i 能达到的水柱高度和其左边的最高柱子、右边的最高柱子有关,我们分别称这两个柱子高度为 l_max...
LeetCode 3. 无重复字符的最长子串
无重复字符的最长子串题目描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 123输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 123输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 1234输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 提示: 0 <= s.length <= 5 * 10^4 s 由英文字母、数字、符号和空格组成 解题思路这道题的最优解法是使用 滑动窗口 算法,通过维护一个滑动窗口 window (通常为 Map 类型)来记录当前不包含重复字符的子串,并且较为简单,不需要保...

