首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【动态规划】将一包含m整数数组分成n数组,每个数组尽量接近

2 抽象 将一包含m整数数组分成n数组,每个数组尽量接近 3 思路 这个问题是典型动态规划问题,理论上是无法找到最优解,但是本次只是为了解决实际生产中问题,而不是要AC,所以我们只需要找到一相对合理算法...输入:int数组,分组数divisionNum 对数组倒序排序 计算数组平均值 avg 遍历数组。...如果第一数大于等于avg,将这个数单独作为一组,因为再加下一数也不会使得求和更接近avg;然后将剩下数重新求平均,表示需要让剩下数分配得更加平均,这样可以避免极值影响,然后重新开始下一轮计算...如果第一数num小于avg,我们将这个数加入到数组中,然后我们需要找到一(或若干)个数,使得其更接近delta = avg-num, 继续遍历数组,若发现某个数k==delta,将k加入到数组,结束本轮寻找...22 3, sum = 53 arr 3 is : 27 10 6 5 2 2 1, sum = 53 4 实现 // 将数组分成n数组,每个数组尽量接近 func GetAvgArr(numberList

6.5K63

2022-04-09:给你两长度分别 n m 整数数组 nums multipliers ,其中 n >= m数组下标 从 1 开始 计数。

2022-04-09:给你两长度分别 n m 整数数组 nums multipliers ,其中 n >= m数组下标 从 1 开始 计数。 初始时,你分数为 0 。...你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要: 选择数组 nums 开头处或者末尾处 整数 x 。...你获得 multipliers[i] * x 分,并累加到你分数中。 将 x 从数组 nums 中移除。 在执行 m 步操作后,返回 最大 分数。 力扣1770。..., M+1) } for L := M - 1; L >= 0; L-- { for j := L + 1; j <= M; j++ { R := N - M + j - 1...indexB := L + N - R - 1 dp[L][j] = getMax(A[L]*B[indexB]+dp[L+1][j], A[R]*B[indexB]+dp[L

48540
您找到你想要的搜索结果了吗?
是的
没有找到

2022-04-09:给你两长度分别 n m 整数数组 nums multipliers ,其中 n >= m数组下标 从 1 开始 计数。

2022-04-09:给你两长度分别 n m 整数数组 nums multipliers ,其中 n >= m数组下标 从 1 开始 计数。 初始时,你分数为 0 。...你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要: 选择数组 nums 开头处或者末尾处 整数 x 。 你获得 multipliersi * x 分,并累加到你分数中。...将 x 从数组 nums 中移除。 在执行 m 步操作后,返回 最大 分数。 力扣1770。 答案2022-04-09: 样本对应模型。 代码用golang编写。...:= len(A) M := len(B) dp := make([][]int, M+1) for i := 0; i < M+1; i++ { dp[i] = make([]int, M+...1) } for L := M - 1; L >= 0; L-- { for j := L + 1; j <= M; j++ { R := N - M + j - 1 indexB

37810

2023-01-06:给定一小写字母组成字符串str,长度为N,给定一0、1组成数组arr,长度为N,arr[i

2023-01-06:给定一小写字母组成字符串str,长度为N, 给定一0、1组成数组arr,长度为N, arr[i]等于 0 表示str中i位置字符不许修改, arr[i] 等于...1表示str中i位置字符允许修改, 给定一正数m,表示在任意允许修改位置, 可以把该位置字符变成a~z中任何一, 可以修改m次。...返回在最多修改m情况下,全是一种字符最长子串是多长。 1 <= N, M <= 10^5, 所有字符都是小写。 来自字节。 答案2023-01-06: 尝试全变成a一直到全变成z,遍历26次。...时间复杂度:O(N)。 空间复杂度:O(1)。 代码用rustsolidity编写。 代码用rust编写。...用完时候 let mut change = 0; for l in 0..n { // l......r -> while

51130

2022-04-27:Alice 有一下标从 0 开始数组 arr , n 正整数组成。她会选择一任意 正整数 k

2022-04-27:Alice 有一下标从 0 开始数组 arr , n 正整数组成。...她会选择一任意 正整数 k 并按下述方式创建两下标从 0 开始新整数数组 lower higher : 对每个满足 0 <= i < n 下标 i ,lower[i] = arr[i] -...给你一 2n 数组成整数数组 nums ,其中 恰好 n 整数出现在 lower ,剩下出现在 higher ,还原并返回 原数组 arr 。...组合 lower higher 得到 [2,6,10,4,8,12] ,这是 nums 排列。 另一有效数组是 arr = [5,7,9] 且 k = 3 。...= nums.len() as isize; // nums[0] -> 小数组第0 let m = n >> 1; // 谁是大数组第0

42030

2023-12-06:用go语言,给你一 n 个数对组成数对数组 pairs, 其中 pairs = [lefti,

2023-12-06:用go语言,给你一 n 个数对组成数对数组 pairs, 其中 pairs[i] = [lefti, righti] 且 lefti < righti 。...2.创建一大小为 n 整型数组 ends,用于存储当前数对链中每个数对右边界值。 3.初始化变量 size 为 0,表示当前数对链长度。...4.遍历排序后数对数组 pairs: • 对于每个数对 pair,使用二分搜索找到 ends 数组中第一大于等于 pair[0] 索引 find。...5.返回变量 size 即为能够形成最长数对链长度。 总时间复杂度:在排序遍历过程中,都需要 O(n log n) 时间复杂度(排序花费 O(n log n),遍历花费 O(n))。...总额外空间复杂度:除了存储输入数据之外,我们额外使用了一大小为 n 数组 ends 来存储数对链右边界。因此,额外空间复杂度是 O(n)。

14920

2023-05-12:存在一 n 节点组成无向连通图,图中节点按从 0 到 n - 1 编号, 给你一数组 graph 表示这个图, 其中,grap

2023-05-12:存在一 n 节点组成无向连通图,图中节点按从 0 到 n - 1 编号,给你一数组 graph 表示这个图,其中,graphi 是一列表,所有与节点 i 直接相连节点组成...2.在 shortestPathLength 函数中,获取图中节点个数 n,使用 Floyd 算法计算所有节点之间最短路径距离,并将结果保存到 distance 二维数组中,同时初始化一 ans...3.接下来,初始化一 dp 数组,其中 dpi 表示当前状态为 i(二进制表示),当前在节点 j 情况下,能形成最短路径长度。同时,对于 dp 数组进行初始化,将所有元素值设为 -1。...如果 dp 数组中已有对应状态当前节点最短路径长度,则直接返回该值,避免重复计算。...空间复杂度:本算法中使用了一距离矩阵 distance 数组来存储节点之间最短路径距离,其空间复杂度为 O(n^2);同时,使用了一 dp 数组来记录状态节点最短路径长度,其空间复杂度也是 O

65110

2022-04-27:Alice 有一下标从 0 开始数组 arr , n 正整数组成。她会选择一任意 正整数 k 并按下述方式创建两下标从 0

2022-04-27:Alice 有一下标从 0 开始数组 arr , n 正整数组成。...她会选择一任意 正整数 k 并按下述方式创建两下标从 0 开始新整数数组 lower higher : 对每个满足 0 <= i < n 下标 i ,loweri = arri - k 对每个满足...给你一 2n 数组成整数数组 nums ,其中 恰好 n 整数出现在 lower ,剩下出现在 higher ,还原并返回 原数组 arr 。...组合 lower higher 得到 2,6,10,4,8,12 ,这是 nums 排列。 另一有效数组是 arr = 5,7,9 且 k = 3 。...= nums.len() as isize; // nums[0] -> 小数组第0 let m = n >> 1; // 谁是大数组第0

74910

2023-05-29:给你一 n 正整数组成数组 nums 你可以对数组任意元素执行任意次数两类操作 如果元素是 偶数 ,除以 2 例如,如果数组

2023-05-29:给你一 n 正整数组成数组 nums你可以对数组任意元素执行任意次数两类操作如果元素是 偶数 ,除以 2例如,如果数组是 1,2,3,4那么你可以对最后一元素执行此操作使其变成...1,2,3,2如果元素是 奇数 ,乘上 2例如,如果数组是 1,2,3,4 ,那么你可以对第一元素执行此操作,使其变成 2,2,3,4数组 偏移量 是数组中任意两元素之间 最大差值。...该算法时间复杂度为 O(nlogn),其中 n数组长度。在最坏情况下,我们需要对所有奇数元素乘以 2,因此数组每个元素最多会被操作两次(一次除以 2,一次乘以 2)。...这样,我们就需要执行 2n 次操作。由于堆插入删除操作都需要 O(logn) 时间,因此算法总时间复杂度为 O(nlogn)。该算法空间复杂度为 O(n),其中 n数组长度。...我们需要使用一堆来存储数组所有元素,因此需要使用 O(n) 额外空间。

41200

2023-03-11:给定一N*M二维矩阵,只字符O、X、S、E组成,O表示这个地方是可通行平地,

2023-03-11:给定一N*M二维矩阵,只字符'O'、'X'、'S'、'E'组成, 'O'表示这个地方是可通行平地, 'X'表示这个地方是不可通行障碍, 'S'表示这个地方有一士兵,全图保证只有一士兵..., 'E'表示这个地方有一敌人,全图保证只有一敌人, 士兵可以在上、下、左、右四方向上移动, 走到相邻可通行平地上,走一步耗费a时间单位, 士兵从初始地点行动时,不管去哪个方向,都不用耗费转向代价...返回士兵找到敌人最少时间。 如果因为障碍怎么都找不到敌人,返回-1, 1 <= N,M <= 1000, 1 <= a,b <= 100000, 只会有一士兵、一敌人。 来自华为。...} } } // 初始化 visited 数组 visited := make([][][]bool, n) for i := range visited { visited...} } } // 初始化优先队列 visited 数组 h := &minHeap{} heap.Init(h) heap.Push(h, node{startX, startY

26320

2023-03-16:给定一 0 1 组成数组 arr ,将数组分成 3 非空部分,使得所有这些部分表示相同

2023-03-16:给定一 0 1 组成数组 arr ,将数组分成 3 非空部分, 使得所有这些部分表示相同二进制值。...答案2023-03-16: 给定一 0 1 组成数组 arr,需要将其分成三非空部分,使得每个部分中 1 数量相等。如果无法做到,则返回 [-1, -1]。...输入: 0 1 组成数组 arr,长度为 n(1 ≤ n ≤ 3×10^4),且只包含数字 0 1。...[start1 - 1, start2] // 返回第一第二数组结束位置 } 算法分析: 该算法时间复杂度为 O(n),其中 n 是输入数组长度,因为需要遍历整个数组一次。...[1, 5]); ``` 总结展望: 本文介绍了一种简单算法,可以解决给定一 0 1 组成数组 arr,需将其分成三非空部分,使得每个部分中 1 数量相等问题。

24420

2022-03-25:给定一长度为 N 字符串 S,字符‘a‘‘b‘组成,空隙 ‘?‘ 表示。 你任务是用a字符或b字符替换每个间隙, 替换完成后想

2022-03-25:给定一长度为 N 字符串 S,字符'a''b'组成,空隙 '?' 表示。...你任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符最长子串尽可能短。 例如,S = "aa??bbb", 如果将"??"...替换为"aa" ,即"aaaabbb",则由相等字符组成最长子串长度为4。 如果将"??"替换为"ba" ,即"aababbb",则由相等字符组成最长子串长度为3。...那么方案二是更好结果,返回3。 S长度 <= 10^6。 来自CMU入学申请考试。 答案2022-03-25: 根据S长度 <= 10^6推断,复杂度是O(N)才能过。...= 右,中间问号长度是大于1奇数。a???b变成abaab或者aabab。 5.左 != 右,中间问号长度等于1。a?b问号根据ab数量决定,谁小成全谁。相等时候,成全左边。

1.3K20

2023-03-11:给定一N*M二维矩阵,只字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行平地, ‘X‘表示这个地方是不可通行

2023-03-11:给定一N*M二维矩阵,只字符'O'、'X'、'S'、'E'组成,'O'表示这个地方是可通行平地,'X'表示这个地方是不可通行障碍,'S'表示这个地方有一士兵,全图保证只有一士兵...,'E'表示这个地方有一敌人,全图保证只有一敌人,士兵可以在上、下、左、右四方向上移动,走到相邻可通行平地上,走一步耗费a时间单位,士兵从初始地点行动时,不管去哪个方向,都不用耗费转向代价...返回士兵找到敌人最少时间。如果因为障碍怎么都找不到敌人,返回-1,1 <= N,M <= 1000,1 <= a,b <= 100000,只会有一士兵、一敌人。来自华为。...{return a}// 标记该位置已经被访问过visited[si][sj][d] = true// 计算从四方向到达下一位置所需代价(如果可以到达的话)var p [4]intp[0] = f...j++ {if mapData[i][j] == 'S' {startX, startY = i, jbreak}}}// 初始化优先队列 visited 数组h := &minHeap{}heap.Init

77500

2022-09-13:给你两整数 m n ,分别表示一块矩形木块宽。 同时给你一二维整数数组 prices ,其中 prices = [hi

2022-09-13:给你两整数 m n ,分别表示一块矩形木块宽。...同时给你一二维整数数组 prices ,其中 pricesi = hi, wi, pricei 表示你可以以 pricei 元价格卖一块高为 hi 宽为 wi 矩形木块。...你可以卖多块同样尺寸木块。你不需要将所有小木块都卖出去。你 不能 旋转切好后木块宽。请你返回切割一块大小为 m x n 木块后,能得到 最多 钱数。注意你可以切割木块任意次。...输入:m = 4, n = 6, prices = [3,2,10,1,4,2,4,1,3]。输出:32。答案2022-09-13:严格位置依赖动态规划版本 + 优化。...优化1 : 递归形式,改成迭代形式;优化2 : prices中单块收益直接填入dp表即可,如果有更好分割方案,更新掉;优化3 : 分割只需要枚举一半即可。时间复杂度:O(N**3)。

40620

2023-03-16:给定一 0 1 组成数组 arr ,将数组分成 3 非空部分, 使得所有这些部分表示相同二进制值。 如果可以做到,请返回任

2023-03-16:给定一 0 1 组成数组 arr ,将数组分成 3 非空部分, 使得所有这些部分表示相同二进制值。...答案2023-03-16: 给定一 0 1 组成数组 arr,需要将其分成三非空部分,使得每个部分中 1 数量相等。如果无法做到,则返回 -1, -1。...输入: 0 1 组成数组 arr,长度为 n(1 ≤ n ≤ 3×10^4),且只包含数字 0 1。...[start1 - 1, start2] // 返回第一第二数组结束位置 } 算法分析: 该算法时间复杂度为 O(n),其中 n 是输入数组长度,因为需要遍历整个数组一次。...[1, 5]); 总结展望: 本文介绍了一种简单算法,可以解决给定一 0 1 组成数组 arr,需将其分成三非空部分,使得每个部分中 1 数量相等问题。

1.2K10
领券