一维最大子数组和(续)

本文介绍了一种求解一维数组中最大子数组和的算法实现,通过逐步展示算法过程,包括子数组的形成、子数组和的计算及比较,最终找到数组中的最大子数组和及其组成元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Scanner;

public class shuzu {
public static int maxArr(int a[]) {
int max=a[0];
for(int i=1;i<a.length;i++) {
if(a[i]>max) {
max=a[i];
}
}
return max;

}

public static void main(String args[]) {
/*
* 生成数组
*/
System.out.println("请输入数组中数字个数");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int[] array = new int[num];
System.out.println("请输入"+num+"个数值");
for(int i = 0;i < num;i++) {
array[i] = scan.nextInt();
}
int lon = ((1+num)/2+1)*num;//存放所有子数组和的 数组
int[] sum = new int[lon];

int sumchangdu = 0;
int sumchangdu1 = 0;
/*求所有子数组的和 放进sum数组中*/
int[] maxarr = new int[num];//存放子数组和最大值的所有组成元素的数组
for(int i = 0;i < num;i++) {
int[] arr = new int[num];//存放当前子数组和的所有组成元素的数组

int asum = 0;
int changdu = 0;
for(int j = 0; j < num - i;j++) {

arr[changdu] = array[i+j];
asum = asum + array[i+j];
sum[sumchangdu] = asum;
sumchangdu1 = sumchangdu+1;
System.out.println("当前执行第"+sumchangdu1+"步");
System.out.println("第"+ sumchangdu1 +"个子数组和为:"+sum[sumchangdu]);
System.out.print("当前组成当前的子数组和的元素为:");
for(int y = 0; y < arr.length;y++) {
if(arr[y]!=0)
System.out.print(arr[y]+" ");
}
System.out.println("");
if(sum[sumchangdu]==maxArr(sum)) {

for(int k =0; k < arr.length;k++)
maxarr[k] = arr[k];

}
System.out.println("当前"+ sumchangdu1 +"个子数组和的最大值为:"+maxArr(sum));

System.out.print("当前组成最大子数组和的元素为:");

for(int x =0;x < maxarr.length;x++ ) {
if(maxarr[x]!=0)
System.out.print(maxarr[x]+" ");

}
System.out.println("");
System.out.println("输入0键开始执行下一步");

int x = scan.nextInt();
if(x==0) {
System.out.println("--------------------------------------------");
sumchangdu++;
changdu++;
}
else {
System.out.println("输入有误,程序退出!");<br> System.exit(0);
}


}
}
scan.close();
int max = sum[0];
for(int m = 1; m < lon;m++) {
if(sum[m]>max) //求sum数组最大的值
max = sum[m];

}
System.out.println("最大子数组和为:"+max);//输出最大的子数组和
}



}

要求:求一个一维数组的最大子数组和,并要求逐步实现,显示执行第几步,当前所处理的元素,当前子数组和,当前最大子数组和以及最大子数组和所组成的元素

思路:定义int[] maxarr = new int[num];//存放子数组和最大值的所有组成元素的数组,int[] arr = new int[num];//存放当前子数组和的所有组成元素的数组,双层for循环实现,用方法public static int maxArr(int a[])判断当前所存储的子数组和是否为最大的子数组,如果是则存储,不是则继续利用上一个最大的子数组和的数组。

 

转载于:https://www.cnblogs.com/muailiulan/p/10772209.html

### 最大子数组问题的 Java 实现 最大子数组问题是通过寻找一维数组中的连子数组最大化其元素之的经典算法问题。Kadane’s Algorithm 是一种高效的线性时间复杂度 \(O(n)\) 的方法,适用于这一类问题。 以下是基于 Kadane’s Algorithm 的 Java 实现: ```java public class MaxSubArray { public static int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) { throw new IllegalArgumentException("Input array cannot be empty or null"); } // 初始化 currentMax maxSoFar 为第一个元素 int currentMax = nums[0]; int maxSoFar = nums[0]; // 遍历数组从第二个元素开始 for (int i = 1; i < nums.length; i++) { // 更新 currentMax:要么继加上当前元素,要么重新开始一个新的子数组 currentMax = Math.max(nums[i], currentMax + nums[i]); // 更新 maxSoFar 记录全局最大子数组 maxSoFar = Math.max(maxSoFar, currentMax); } return maxSoFar; } public static void main(String[] args) { int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; System.out.println(maxSubArray(nums)); // 输出: 6 } } ``` 上述代码实现了 Kadane’s Algorithm,在每次迭代中更新 `currentMax` 表示以当前位置结尾的最大子数组,并用 `maxSoFar` 来跟踪整个过程中的最大值[^4]。 #### 关于为何 Kadane’s Algorithm 被认为是动态规划的一部分 Kadane’s Algorithm 可视为动态规划的一种应用形式,因为它利用了状态转移的思想。具体来说,它定义了一个局部最优解(即以某个位置结束的最大子数组),并通过逐步扩展这个局部最优解来构建最终的全局最优解[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值