首页 > 代码库 > LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方式
LeetCode OJ平台上Maximum Subarray题目O(n)复杂度解决方式
原始题目例如以下,意为寻找数组和最大的子串,返回这个最大和就可以。
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [?2,1,?3,4,?1,2,1,?5,4]
,
the contiguous subarray [4,?1,2,1]
has the largest sum = 6
.
最普通的方法就是两层循环来寻找,复杂度为O(n^2).
在木易先森的指导下,有一个极其简单的O(n)复杂度的方法:
- 先找出数组max值,假设max小于0 ,啥也别说了,直接返回max.
- 设置辅助变量currentmax=0;数组从头至尾扫描一遍
- 假设currentmax + A[i] <= 0,意味着这个子串对于我们寻找最大和是没有不论什么帮助的,此时,直接再置currentmax = 0
- 假设currentmax + A[i] > 0,意味着这个子串的和是有意义的,将这个和跟max比較,时刻保持max的值是当前最理想的最大值
- 最后返回max就可以
源码例如以下:
public class Solution { public static int maxSubArray(int[] A) { if(A.length == 0) return 0; int max = A[0]; for(int i = 0; i < A.length; i ++) if(A[i] > max) max = A[i]; if(max <= 0) return max; int currentmax = 0; for(int i = 0;i < A.length; i ++){ currentmax += A[i]; if(currentmax <= 0){ currentmax = 0; continue; } else{ if(currentmax > max) max = currentmax; } } return max; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。