求数组(元素可为正数、负数、0)的最大子序列和
2016-08-16 14:29
330 查看
1、求数组(元素可为正数、负数、0)的最大子序列和:
代码实现:
实现方法:
1、借助上一题思想。先将数组从右至左将最大值保存到一个数组中。(在此注意必须是从倒数第二个开始,两个子数组大小至少为2)
2、以arr[0]为分割,temp[1]即是从arr[1]-arr[len-1]的最大值,以其两个和为基准result。
3、从左至右,算出当前位置i最大值加上temp[i+1](在此是i+1到len-1的最大值)与基准即result比较,得到的最大值,即为所求。
代码:
代码实现:
int max(int a, int b) { if (a > b) return a; else return b; } int FindMaxArr(int arr[],int len) { assert(arr); int result = arr[0]; int cur = arr[0]; for (int i = 1; i < len; i++) { cur = cur>0 ? cur : 0; cur += arr[i]; result = max(cur, result); } return result; }2、求两个子数组的最大和
实现方法:
1、借助上一题思想。先将数组从右至左将最大值保存到一个数组中。(在此注意必须是从倒数第二个开始,两个子数组大小至少为2)
2、以arr[0]为分割,temp[1]即是从arr[1]-arr[len-1]的最大值,以其两个和为基准result。
3、从左至右,算出当前位置i最大值加上temp[i+1](在此是i+1到len-1的最大值)与基准即result比较,得到的最大值,即为所求。
代码:
int max(int a, int b) { if (a > b) return a; else return b; } int FindMaxArr(int arr[], int len) { if (arr == NULL || len < 2) //既然是两个子数组那么长度必须大于2 return 0; int *temp= new int[len]; temp[len - 1] = arr[len - 1]; int cur = arr[len - 1]; for (int i = len - 2; i >= 0; --i) { cur = cur>0 ? cur : 0; cur += arr[i]; temp[i] = max(cur, temp[i + 1]); } int result = arr[0] + temp[1];//如果以0为界arr[0]与arr[1]-arr[n-1]两个子数组的和; int leftmax = arr[0]; cur = arr[0]; for (int i = 1; i < len - 1; ++i)//注意小于len-1 { cur = cur>0 ? cur : 0; cur += arr[i]; leftmax = max(cur, leftmax); result = max(result,leftmax+temp[i+1]); } return result; }
相关文章推荐
- 【100题】第三题(数组(元素可为正数、负数、0)的最大子序列和)
- 求数组(元素可为正数、负数、0)的最大子序列和。
- 求数组(元素可为正数、负数、0)的最大子序列和,
- 求数组(元素可为正数、负数、0)的最大子序列和。
- 求数组(元素可为正数、负数、0)的最大子序列和
- 求数组(元素可为正数、负数、0)的最大子序列和。
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)
- 算法题:找出一个数组中相加值最大的连续序列元素
- 一个数组 里面正数和负数求所有子数组的最大值
- 给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现
- [LeetCode] House Robber II 求循环数组中元素两两不相邻的子序列最大和
- 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。
- 输入一个整形数组,数组中有正数也有负数,求该数组中所以子数组和的最大值
- 一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n)。
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 找出一个个既有正数又有负数的数组中子数组的和的最大值
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。