首页
学习
活动
专区
圈层
工具
发布

求一个数组中子数组的最大和算法(Java实现)

前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现无法回复,然后整理出一篇简短博客吧...原题及解答     来自《小技巧求一个数组中子数组的最大和》;     题目:     输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。...求所有子数组的和的最大值。要求时间复杂度为 O(n)。...当求和为负数时,重新开始计算求和,子数组的开始重置为下一个元素。 2....当全为正数时,最大的和自然就是所有元素的和,当全为负数时,最大和自然就是其中最大的那个负数的值。通过此算法都能得到相应的结果。

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

    数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...简介:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...该算法的实现思路如下: 使用一个变量ans存储最终的答案,使用一个变量cur存储当前的连续子数组和。 遍历整个数组,对于每一个数字,更新cur为它自身和(cur + nums[i])之间的较大值。...,维护了两个变量ans和cur,其中ans表示目前找到的最优连续子序列的和,cur是num[i]为结尾的连续子数组的和。...由于只有一层循环,该算法的时间复杂度为 O(n)。

    44210

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

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

    7.5K63

    实现一个函数 splice(int, int n, int m) 将数组 b 插入到数组 a 的第 n 个位置上去,并将其后面的元素后移 m 个位置,同时更新数组 a 的长度

    数据结构与算法面试题:实现一个函数 splice(int[] a, int b[], int n, int m) 将数组 b 插入到数组 a 的第 n 个位置上去,并将其后面的元素后移 m 个位置,同时更新数组...a 的长度 简介:实现一个函数 splice(int[] a, int b[], int n, int m) 将数组 b 插入到数组 a 的第 n 个位置上去,并将其后面的元素后移 m 个位置,同时更新数组...a 的长度 算法思路 算法思路: 本题要求我们在一个已有数组a中插入另一个数组b,并将a的长度相应更新。..., m); // 调用splice函数 return 0; } 需要注意的是,上述代码中实现了两个基础操作:首先使用memcpy函数复制了原数组中待移动的一段元素;随后在for循环中从后往前移动前面的元素...(a, b, n, m); // 调用splice方法 } } 在Java中,System.arraycopy方法拷贝从指定源数组的一个位置开始,到指定目标数组的一个位置结束,并取代原数组中相应位置上的元素

    42700

    - 从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的

    题目:从长度为m的int数组中随机取出n个元素,每次取的元素都是之前未取过的 Fisher-Yates洗牌算法是由 Ronald A.Fisher和Frank Yates于1938年发明的,后来被Knuth...我们现在所使用的各种算法复杂度分析的符号,就是他发明的。...等概率: 洗牌算法有些人也称等概率洗牌算法,其实发牌的过程和我们抽签一样的,大学概率论讲过抽签是等概率的,同样洗牌算法选中每个元素是等概率的。...用洗牌算法思路从1、2、3、4、5这5个数中,随机取一个数 4被抽中的概率是1/5 5被抽中的概率是1/4 * 4/5 = 1/5 2被抽中的概率是1/3 * 3/4 *...该算法的基本思想和 Fisher 类似,每次从未处理的数据中随机取出一个数字,然后把该数字放在数组的尾部,即数组尾部存放的是已经处理过的数字。

    2.5K10

    精通Excel数组公式005:比较数组运算及使用一个或多个条件的聚合计算

    下面是Excel的比较运算符: = 等于 不等于 > 大于 >= 大于等于 小于 小于等于 在诸如基于条件查找最小值或最大值、计算标准偏差等情形时,Excel没有提供相应的内置函数,必须编写数组公式...图1 使用数组公式 Excel中没有一个MINIF函数来根据条件求相应的最小值,可以使用MIN/IF函数组合来实现。...图3 有时候,对于非常大的数据来说公式计算时间过长是个问题,下图4展示了一个解决方案,充分利用D-函数优于数组公式计算的优势。 ? 图4 下面是创建上述解决方案的步骤: 1....可以看出,数据透视表对于带有一个或多个判断条件的聚合计算非常方便,但是与公式相比,当源数据变化时,它不能立即更新,需要刷新才能更新其内容。...此示例也可以使用上文介绍的DMAX函数或数据透视表来实现,有兴趣的朋友可以试试。 再看一个示例。

    9.5K40

    2025-07-14:统计恰好有 K 个相等相邻元素的数组数目。用go语言,给定三个整数 n、m、k,定义一个长度为 n 的数组

    2025-07-14:统计恰好有 K 个相等相邻元素的数组数目。...用go语言,给定三个整数 n、m、k,定义一个长度为 n 的数组 arr 满足以下条件: • arr 中的每个元素都是 1 到 m 之间的整数(包含边界)。...问题分解: • 我们需要构造一个长度为 n 的数组,其中有恰好 k 个相邻元素对是相等的。 • 这可以转化为:将数组分成 n - k 个“块”,其中每个块内的元素相同,但相邻块之间的元素不同。...第一个块有 m 种选择(1 到 m),后续的每个新块必须与前一个块的值不同,因此有 m - 1 种选择。...计算结果: • 使用预计算的组合数和快速幂计算结果: • ans = C(n - 1, k) * m % MOD * (m - 1)^(n - k - 1) % MOD。 时间和空间复杂度 1.

    11600

    大厂算法面试:使用移动窗口查找两个不重叠且元素和等于给定值的子数组

    我们看看这次题目: 给定一个所有元素都是正整数的数组,同时给定一个值target,要求从数组中找到两个不重叠的子数组,使得各自数组的元素和都等于给定数值target,并且要求两个数组元素个数之和最小,例如给定数组为...使用滑动窗口我们能方便的找到元素和等于给定值的子数组。注意到数组只包含正整数,因此如果保持start不变,end向右边移动,那么窗口内部的元素和就会变大,如果保持end不变,那么窗口内元素和就会减小。...如此类推,我们从数组最左端出发,如果窗口内元素和小于给定指定值,那么就向右移动end,如果大于给定值,那么就像左移动一个单位,当窗口挪出数组,也就是end的值大于数组最后一个元素的下标时,查找结束,当前能找到所有满足元素和等于特定值的所有子数组...首先它的值为0,如果sub_array[subarray_index]对应的子数组不跟当前窗口重叠,也就是给定子数组的末尾元素其下标小于start,那么我们就能增加subarray_index的值以遍历下一个元素...,由于算法只需要使用滑动窗口对数组进行一次变量,因此时间复杂度为O(n),同时我们需要使用一个队列来存放满足条件的子数组,因此空间复杂度为O(n),这道题的难点在于获得两个不重叠的子数组,我花费了大量的时间在调试这一点上

    2.1K20

    2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1

    2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr...求最小out的元素之和。比如[2,3,5,5,4],生成数组是[1,2,3,2,1],和是9。 福大大 答案2021-06-18: 1.从左往右遍历,生成left数组。...[2,3,5,5,4]的left数组是[1,2,3,1,1]。 2.从右往左遍历,生成right数组。当arr[cur]>arr[cur+1]时,right[cur]=right[cur+1]+1。...[2,3,5,5,4]的right数组是[1,1,1,2,1]。 3.生成数组out,out数组的i位置元素是left数组i位置元素和right数组i位置元素的最大值。...[2,3,5,5,4]的out数组是[1,2,3,2,1]。 4.求数组out的累加和,这个累加和就是需要的返回值。 5.时间复杂度O(N)。空间复杂度O(N)。 代码用golang编写。

    69210

    算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)

    昨天面试被问到这道算法题,一时没有回答上来,今天思考了一下,参阅了网上的教程,做了一个JAVA版本的实现。...方案一: 新建一个N*L的数组,将原始数组拼接存放在这个大数组中,再调用Arrays.sort()进行排序,或者使用其它排序方法即可。...实现最小堆,需要定义一个指针数组,用于保存这N个数组的index,定义Node类用于保存当前数值(value)和该数字所在的数组序号(idx),并且覆写Comparetor的compare方法实现自定义排序...思路:首先将N个数组的第一位放到PriorityQueue,循环取出优先队列的首位(最小值)放入result数组中,并且插入该首位数字所在数组的下一个数字(如果存在),直到所有数字均被加入到result...数组即停止(N*L)次。

    1.2K40

    算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)

    昨天面试被问到这道算法题,一时没有回答上来,今天思考了一下,参阅了网上的教程,做了一个JAVA版本的实现。...方案一: 新建一个N*L的数组,将原始数组拼接存放在这个大数组中,再调用Arrays.sort()进行排序,或者使用其它排序方法即可。...实现最小堆,需要定义一个指针数组,用于保存这N个数组的index,定义Node类用于保存当前数值(value)和该数字所在的数组序号(idx),并且覆写Comparetor的compare方法实现自定义排序...思路:首先将N个数组的第一位放到PriorityQueue,循环取出优先队列的首位(最小值)放入result数组中,并且插入该首位数字所在数组的下一个数字(如果存在),直到所有数字均被加入到result...数组即停止(N*L)次。

    87440

    【算法题】输入一维数组array和n,找出和值为n的任意两个元素

    题目描述 输入一维数组array和n,找出和值为n的任意两个元素。例如: array = [2, 3, 1, 10, 4, 30] n = 31 则结果应该输出1, 30 顺序不重要。...package com.light.sword; /** * @author: Jack * 2021/4/21 下午7:51 * * 输入一维数组array和n,找出和值为n的任意两个元素...例如: * array = [2, 3, 1, 10, 4, 30] * n = 31 * 则结果应该输出1, 30 顺序不重要 * 如果有多个满足条件的,返回任意一对即可 */ public......... (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成 (4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的...(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。 (6)依次类推,每一趟比较次数减少依次

    1.7K20

    2024-05-22:用go语言,你有一个包含 n 个整数的数组 nums。 每个数组的代价是指该数组中的第一个元素的值。 你的

    2024-05-22:用go语言,你有一个包含 n 个整数的数组 nums。 每个数组的代价是指该数组中的第一个元素的值。 你的目标是将这个数组划分为三个连续且互不重叠的子数组。...• 定义并调用 minimumCost 函数来计算划分成三个子数组后的最小代价之和。...• 对于给定的数组 nums,迭代从第二个元素开始的所有元素: • 如果元素 x 小于当前最小值 fi,则将第二小值 se 更新为当前最小值 fi,并更新最小值为 x。...• 否则,如果元素 x介于当前最小值 fi 和第二小值 se 之间,则更新第二小值 se 为 x。 • 返回结果为数组第一个元素 nums[0] 与找到的两个最小值 fi 和 se 的和。...4.时间复杂度: • 迭代一次数组,需要 O(n) 的时间复杂度,其中 n 是数组的长度。 5.空间复杂度: • 除了输入的数组外,算法只使用了常量级别的额外空间,因此空间复杂度为 O(1)。

    75010
    领券