深圳网络科技有限公司有哪些,百度seo快速见效方法,兰州交通发展建设集团公司网站,怎样在百度上打广告#x1f680; 博主介绍#xff1a;大家好#xff0c;我是无休居士#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师#xff01; #x1f680;
#x1f31f; 在这里#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人#xff0c;我不仅热衷… 博主介绍大家好我是无休居士一枚任职于一线Top3互联网大厂的Java开发工程师 在这里你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人我不仅热衷于探索一些框架源码和算法技巧奥秘还乐于分享这些宝贵的知识和经验。 无论你是刚刚踏入编程世界的新人还是希望进一步提升自己的资深开发者在这里都能找到适合你的内容。我们共同探讨技术难题一起进步携手度过互联网行业的每一个挑战。 如果你觉得我的文章对你有帮助请不要吝啬你的点赞分享和评论哦 让我们一起打造一个充满正能量的技术社区吧 目录标题 题目问题分析解决方案步骤Java实现代码代码解析复杂度分析 题目
输入一个长度为n的整型数组array数组中的一个或连续多个整数组成一个子数组找到一个具有最大和的连续子数组。
子数组是连续的比如[1,3,5,7,9]的子数组有[1,3][3,5,7]等等但是[1,3,7]不是子数组如果存在多个最大和的连续子数组那么返回其中长度最长的该题数据保证这个最长的只存在一个该题定义的子数组的最小长度为1不存在为空的子数组即不存在[]是某个数组的子数组返回的数组不计入空间复杂度计算
要解决这个问题我们可以使用一种经典的算法称为Kadane’s Algorithm用于找到具有最大和的连续子数组。接下来我们将结合题目的要求来实现这个算法。
问题分析
最大和子数组我们需要遍历数组并维护当前子数组的和同时更新最大和。长度管理在更新最大和时我们需要记录对应的子数组的长度以确保在出现相同最大和时选择长度最长的子数组。边界条件需要注意数组至少有一个元素的情况。
解决方案步骤
初始化当前和和最大和。遍历数组更新当前和。如果当前和小于零重置当前和和长度。在每次更新最大和时记录当前子数组的长度。返回最大和的子数组及其长度。
Java实现代码
public class Solution {/*** 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可** param array int整型一维数组 * return int整型一维数组*/public int[] maxSubArray(int[] array) {int n array.length;if (n 0) return new int[0]; // 不应该发生题目假定至少一个元素int maxSum Integer.MIN_VALUE; // 最大和int currentSum 0; // 当前和int maxLength 0; // 最大和子数组的长度int currentLength 0; // 当前子数组的长度int startIndex 0; // 记录最大和子数组的起始索引int tempStartIndex 0; // 记录当前子数组的起始索引for (int i 0; i n; i) {currentSum array[i];currentLength;// 更新最大和及其长度if (currentSum maxSum) {maxSum currentSum;maxLength currentLength;startIndex tempStartIndex;} else if (currentSum maxSum) {// 如果当前和等于最大和比较长度if (currentLength maxLength) {maxLength currentLength;startIndex tempStartIndex;}}// 如果当前和小于零重置if (currentSum 0) {currentSum 0;currentLength 0;tempStartIndex i 1; // 更新起始索引}}// 构造结果数组int[] result new int[maxLength];for (int i 0; i maxLength; i) {result[i] array[startIndex i];}return result;}
}代码解析 初始化变量 maxSum 用于存储最大和初始值设为 Integer.MIN_VALUE 以处理负数情况。currentSum 用于记录当前子数组的和。maxLength 和 currentLength 分别用于记录最大和子数组的长度和当前子数组的长度。startIndex 和 tempStartIndex 用于追踪子数组的起始位置。 遍历数组 对于每个元素更新 currentSum 和 currentLength。检查当前和是否大于最大和如果是更新最大和及其长度。如果当前和小于零重置当前和和长度并更新子数组的起始位置。 返回结果 根据 startIndex 和 maxLength 构造最终的子数组并返回。
复杂度分析
时间复杂度(O(n))只需遍历一次数组。空间复杂度(O(1))不计返回的结果数组。
这种方法既高效又满足题目的所有要求。如果你有任何其他问题或需要进一步的帮助请告诉我 乐于分享和输出干货的WXGZGJavaPersons