4.1-1
返回由最大负数组成的单元素子数组
4.1-2
代码如下:
#include<iostream>
using namespace std;
int main() {
int a[16] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7 };
int n = 16;
int max_sum = 0, max_left = 0, max_right = 0;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += a[j];
if (sum > max_sum) {
max_sum = sum;
max_left = i;
max_right = j;
}
}
}
printf("sum: %d [%d,%d]", max_sum, max_left, max_right);
return 0;
}
4.1-3
一个的复杂度是 O ( n 2 ) O(n^2) O(n2),一个是 O ( n l g ( n ) ) O(nlg(n)) O(nlg(n)),思路是先计算出交叉点,再设计大致规模的测试数据,具体的懒得实操了。
修改后算法就是暴力法和递归法的结合,由于 n 0 n_0 n0的存在,在 [ 0 , n 0 ] [0,n_0] [0,n0]之间是暴力法,在 [ n 0 , + ∞ ] [n_0,+∞] [n0,+∞]是递归法
-
若 n 0 n_0 n0小于等于原交叉点 x 0 x_0 x0时,交叉点不改变,因为在原交叉点 [ n 0 , x 0 ] [n_0,x_0] [n0,x0]仍是递归法,且此时递归处理的效率不如暴力处理,从 x 0 x_0 x0之后递归的效率才超出暴力法
-
若 n 0 n_0 n0大于原交叉点 x 0 x_0 x0时,交叉点增大到 n 0 n_0 n0,此时改良后的算法在 [ 0 , x 0 ] [0,x_0] [0,x0]时效率等于暴力法,在 [ x 0 , n 0 ] [x_0,n_0] [x0,n0]之间,虽然递归处理效率更高,但是由于仍使用暴力法,所以并没有性能交叉,而在 [ n 0 , + ∞ ] [n_0,+∞] [n0,+∞]之后,采用了递归法,且由于 x 0 < n 0 x_0<n_0 x0<n0,此时递归效率高于暴力法,所以性能交叉点变为 n 0 n_0 n0
4.1-4
在high=low时,即递归终结点处,设置,若此时a[high]<0,则返回(-1,-1,0)。
4.1-5
如图,写的有点乱,a、max、b既代表子数组又代表子数组之和。