package dynamicprogramming; /** * @author Eightn0 * @create 2021-03-29 19:11 * 题目:给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12. 题目保证没有全为负数的数据 要求:时间复杂度为O(n),空间复杂度为O(1) 分析:对于动态规划问题来说,最关键的是要找到状态和状态转移方程。 在本题中,状态是子数组和s(i) 状态转移方程是s(i)=s(i-1)+i */ public class SumInArray { public int maxsumofSubarray (int[] arr) { int sum = Integer.MIN_VALUE;//初始化总和,minvalue是Java能使用的int型的最小数字 int[] s = new int[arr.length + 1]; //记录状态 for (int i = 0; i < arr.length; i++) { s[i + 1] = s[i] + arr[i];//状态转移方程 if (s[i + 1] < 0){//根据题意,数组内的量不可能全为负数,因此算出负数的时候就从下一个正数重新开始 s[i + 1] = 0; } sum = Math.max(sum, s[i + 1]); } return sum; } public static void main(String[] args) { int[] arr = new int[]{1, -2, 3, 5, -2, 6, -1}; SumInArray sumInArray = new SumInArray(); System.out.println(sumInArray.maxsumofSubarray(arr)); } }
数组最大和
最新推荐文章于 2024-05-30 10:34:55 发布