手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

使用java实现求最大和非空子数组的问题

时间:2024-10-27 20:18:45

1、我们嚼但匙噻首先描述这个问题的解决思路。基本的思路是采用分治法:对于一个数组A[low...high],将其从中间分为怎剑词阶两个部分a[low...mid]与a[mid+1...high]。这样,任何连续子数组必定属于以下三种情况之一:1.完全位于左侧数组;2.完全位于右侧数组;3.跨越了中间元素的数组。

使用java实现求最大和非空子数组的问题

2、我们可以在线性时间内求出跨越mid位置元素的子数组。从mid位置开始,依次向两侧搜索,可以获得跨越mid位置元素的子数组,返回最终的左侧位置、右侧位置与最大和。

使用java实现求最大和非空子数组的问题
使用java实现求最大和非空子数组的问题

3、然后使用递归找出长度缩小一半的两部分数组的最大子数组,最后返回三者之中的最大值,递归出口为数组只有一个元素。以下为该思路的伪代码。

使用java实现求最大和非空子数组的问题

4、下面我们使用java语言实现以上的算法。首先,由于以上两个函数返回值均为多个值,但数据类型均为整型,因此返回值为List<Integer>,将返回值完全封装在里面。首先求出mid左侧的最大值,实现方法如下。

使用java实现求最大和非空子数组的问题

5、右侧采用与左侧相同的策略,从mid+1开始遍历,得出右侧部分的最大和并记录右侧的位置,然后返回子数组的始末位置与最大和。

使用java实现求最大和非空子数组的问题

6、然后使用递归策略,反复调用该方法,每调用一个,数组的长度减半,直到每一个数组只剩下一个元素时,递归开始回溯。

使用java实现求最大和非空子数组的问题

7、接下来测试以上的算法,使用数组{13, -3巳呀屋饔, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7},测试代码如下。这里使吹涡皋陕用流操作与Lambda表达式输出子数组。

使用java实现求最大和非空子数组的问题

8、输出结果如下,与实际的最大值相同。

使用java实现求最大和非空子数组的问题
© 手抄报圈