题目简介:给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
注意:数组长度 n 满足以下条件:
1 ≤ n ≤ 1000
1 ≤ m ≤ min(50, n)
示例:
1234567891011输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分为[7,2,5] 和 [10,8],因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
思路:动态规划,dp[i][j]代表前i个数字分成j段,所有情况下,其各段和...
题目简介:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
12345678输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。
思路:动态规划,dp[i][j]代表以grid[i][j]为右下角时的最小路径和。
首先初始化第一行和第一列。
由于每次只能向下或者向右移动一步,所以dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]。
最后返回dp[grid...
题目简介:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
12输入:[3,4,5,1,2]输出:1
示例 2:
12输入:[2,2,2,0,1]输出:0
思路:摸鱼做法:直接sort,返回数组最小值即可。
二分做法:设最小值在数组的下标为min,将每次的numbers[mid]与numbers[right]比较,存在三种情况:
numbers[mid] < numbers[right],此时mi...
题目简介:给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
示例:
1234567891011121314151617输入:3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / ...
题目简介:给定一个已按照 升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
123输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
思路:双指针,一共有三种情况:
number...
题目简介:有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。
求所能获得硬币的最大数量。
说明:
你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
0 ≤ n ≤ 500, 0 ≤ nums[i] ≤...
题目简介:给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
12输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出: true
示例 2:
12输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出: false
思路:动态规划,dp[i][j]代表s1的前i个字符和s2的前j个字符能否构成s3的前i + j个字符。
...
题目简介:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
12输入: [1,3,5,6], 5输出: 2
示例 2:
12输入: [1,3,5,6], 2输出: 1
示例 3:
12输入: [1,3,5,6], 7输出: 4
示例 4:
12输入: [1,3,5,6], 0输出: 0
思路:直接二分查找即可。时间复杂度O(logn)。
tip:
找不到目标值时,最后返回left即可。
代码如下:12345678910111213141516171819202122cla...
题目简介:给定一个无向图graph,当这个图为二分图时返回true。
如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。
graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。
12345678910示例 1:输入: [[1,3], [0,2], [1,3], [0,2]]输出: true解释: 无向图如下:0----1...
题目简介:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
12345678910输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:动态规划,dp[i]代表i个节点能...