45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处:
0 <= j <= nums[i] 且
i + j < n
返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 n - 1。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
1 <= nums.length <= 10(4)
0 <= nums[i] <= 1000
题目保证可以到达 n - 1
第 1 步:最少步数 → BFS。 每次跳跃代价相同,“最少几跳”就是最短路,无权图最短路就是 BFS。
第 2 步:把数组看成图。 节点是下标,i 连向 i+1 … i+nums[i]。
BFS 第 k 层 ...
42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
**输入:**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:
**输入:**height = [4,2,0,3,2,5]
**输出:**9
提示:
n == height.length
1 <= n <= 2 * 10(4)
0 <= height[i] <= 10(5)
每次只有遇到比前面高的方块时才需要更新ans,所以考虑使用单调栈
单调递减,栈顶小于当前元素时弹出,然后更新ans,更新时注意比较前一个元素与当前元素,取较小的值作为高
因为矮的元素会被弹出,所以我们必须记录下标索引,这样后面遇到高元素时才能同时考虑矮元素
1234567891011121314151617181920212223class Solution { ...
41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
示例 1:
**输入:**nums = [1,2,0]
**输出:**3
**解释:**范围 [1,2] 中的数字都在数组中。
示例 2:
**输入:**nums = [3,4,-1,1]
**输出:**2
**解释:**1 在数组中,但 2 没有。
示例 3:
**输入:**nums = [7,8,9,11,12]
**输出:**1
**解释:**最小的正数 1 没有出现。
提示:
1 <= nums.length <= 10(5)
-2(31) <= nums[i] <= 2(31) - 1
求没出现的最小正整数
也就是从1开始依次判断在不在数组中
核心思想是把数字和下标对应
即我们可以把1存在0号索引处,2存在1号索引处。。。
之后再遍历一次找到不符合对应关系的索引即可
对于非正数直接跳过
对于大于size的直接跳过,因为在交换过程中他们会慢慢移到数组末尾
已经就位的元素直接跳过,目的索引已经被对应好(重复元素 ...
39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
**输入:**candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:
输入: candidates = [2], target = 1
输出: []
提示:
1 <= candidates.length & ...
33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
**输入:**nums = [4,5,6,7,0,1,2], target = 0
**输出:**4
示例 2:
**输入:**nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
**输入:**nums = [1], target = 0
输出:-1
提示:
1 & ...
25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
**输入:**head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
**输入:**head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
提示:
链表中的节点数目为 n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
**进阶:**你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?
模拟,每次获取要反转的头节点和尾结点
反转完成后返回新的头节点和尾结点
然后把反转结果接入
12345678910111213141516171819202122232425262728293031323334Bash class Solution {public: ListNo ...






