416. 分割等和子集(较难)
416. 分割等和子集(较难)给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。
提示:1 <= nums.length <= 2001 <= nums[i] <= 100
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-equal-subset-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:将题目转成01背包问题来想:几个比较难的点,一个是背包的总容量,应该是所有数加起来的二分之一,如果总数为奇数,那么一定没有等和子集,然后还有就是nums[i]既是物品重量又是物品价值,这一点一定注意,然后就是要注意,一维dp中的各种表示
代码:12345678910 ...
63. 不同路径 II(一般)
63. 不同路径 II(一般)一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
示例 1:
12345678输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]输出:2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:1. 向右 -> 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
12输入:obstacleGrid = [[0,1],[0,0]]输出:1
提示:m == obstacleGrid.lengthn == obstacleGrid[i].length1 <= m, n <= 100obstacleGrid[i] [j] 为 0 或 ...
746. 使用最小花费爬楼梯(一般)
746. 使用最小花费爬楼梯(一般)数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
示例 1:输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。
示例 2:输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]输出:6解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。
提示:cost 的长度范围是 [2, 1000]。cost[i] 将会是一个整型数据,范围为 [0, 999] 。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs著作权归领扣网 ...
143. 重排链表(一般)
143. 重排链表(一般)给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reorder-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:将原链表转成数组类型,顺序读取,前后指针,一起取数
代码:1234567891011121314151617181920212223242526272829class Solution { public void reorderList(ListNode head) { //题意理 ...
797. 所有可能的路径(一般)
797. 所有可能的路径(一般)给一个有 n 个结点的有向无环图,找到所有从 0 到 n-1 的路径并输出(不要求按顺序)
二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a )空就是没有下一个结点了。
示例 1:
输入:graph = [[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]]解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
示例 2:
输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
示例 3:输入:graph = [[1],[]]输出:[[0,1]]
示例 4:输入:graph = [[1,2,3],[2],[3],[]]输出:[[0,1,2,3],[0,2,3],[0,3]]
示例 5:输入:graph = [[1,3],[2],[3],[]]输出:[[0,1,2,3],[0,3]]
提 ...
718. 最长重复子数组(一般)
718. 最长重复子数组(一般)给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例:123456输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。
提示:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
思路:动态规划
代码:123456789101112131415161718192021222324252627282930class Solution { public int findLength(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; //暴力求 ...
209. 长度最小的子数组(一般)
209. 长度最小的子数组(一般)给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:123输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:12输入:target = 4, nums = [1,4,4]输出:1
示例 3:12输入:target = 11, nums = [1,1,1,1,1,1,1,1]输出:0
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
思路:滑动窗口
代码1:123456789101112131415161718192021class Solution { pu ...
69. x 的平方根(简单)
69. x 的平方根(简单)实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:12输入: 4输出: 2
示例 2:1234输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sqrtx
思路:二分
代码:1234567891011121314class Solution { public int mySqrt(int x) { if (x == 0) { return 0; } int ans = (int) Math.exp(0.5 * Math.log(x)); return (long) (ans + 1) * (ans + 1) <= x ? ans + 1 : ...
42. 接雨水(困难)
42. 接雨水(困难)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
123输入: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.length0 <= n <= 3 * 1040 <= height[i] <= 105
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/trapping-rain-water
思路:双指针
https://leetcode-cn.com/problems/trapping-rain-water/solution/42-jie-yu-shui-shuang-zhi-zhen-dong-tai-wguic/
代码1: ...
199. 二叉树的右视图(简单)
199. 二叉树的右视图(简单)给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:123456789输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
思路:层次遍历,取最后一个数就行
代码1:123456789101112131415161718192021222324252627class Solution { public List<Integer> rightSideView(TreeNode root) { //层次遍历,选择每层的最后一个节点输出到结果中 List<Integer> r ...