问题描述:股票获得最大收益。很难做到最低买入,最高卖出。
暴力求解:简单的尝试对每对可能的买进卖出日期组合,只要卖出日期在买进日期之后即可。
问题变换:不再从每日的价格角度看待输入数据,而是考虑每日价格变化,第i天价格变化定义为第i天和第i-1天的价格差,问题转化为寻找最大的非空连续子数组。
[13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,-7]
emmmm,求最大连续子数组不需要考虑复杂度的话也可以反过来暴力求解啊
1 #include<stdio.h> 2 #include<limits.h> 3 #include<stdlib.h> 4 5 int* max_cross(int* a, int low, int mid, int high) 6 { 7 int left_sum = INT_MIN; 8 int max_left; 9 int i; 10 int sum = 0; 11 12 for (i = mid; i >= low; i--) 13 { 14 sum += a[i]; 15 16 if (sum > left_sum) 17 { 18 left_sum = sum; 19 max_left = i; 20 } 21 } 22 23 int right_sum = INT_MIN; 24 int max_right; 25 int j; 26 sum = 0; 27 28 for (j = mid+1; j <= high; j++) 29 { 30 sum += a[j]; 31 32 if (sum > right_sum) 33 { 34 right_sum = sum; 35 max_right = j; 36 } 37 } 38 39 int* p = (int*)malloc(3 * sizeof(int)); 40 p[0] = max_left; 41 p[1] = max_right; 42 p[2] = left_sum + right_sum; 43 44 return p; 45 46 } 47 48 int *max_subarray(int* a, int low, int high) 49 { 50 int *p = (int *)malloc(3 * sizeof(int)); 51 int *left = (int *)malloc(3 * sizeof(int)); 52 int *right = (int *)malloc(3 * sizeof(int)); 53 int *cross = (int *)malloc(3 * sizeof(int)); 54 55 if (low == high) 56 { 57 p[0] = low; 58 p[1] = high; 59 p[2] = a[low]; 60 return p; 61 } 62 63 else 64 { 65 int mid = (low + high) / 2; 66 left = max_subarray(a, low, mid); 67 right = max_subarray(a, mid + 1,high); 68 cross = max_cross(a, low, mid, high); 69 70 if (left[2] >= right[2] && left[2] >= cross[2]) 71 { 72 return left; 73 } 74 else if (right[2] >= left[2] && right[2] >= cross[2]) 75 { 76 return right; 77 } 78 else 79 return cross; 80 } 81 } 82 83 int main() 84 { 85 int* max = (int*)malloc(3 * sizeof(int)); 86 int matrix[] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,-7 }; 87 88 max = max_subarray(matrix, 0, 16 - 1); 89 90 for (int i = max[0]; i <= max[1]; i++) 91 { 92 printf("%d ", matrix[i]); 93 } 94 printf("\n"); 95 printf("%d", max[2]); 96 }
原文:https://www.cnblogs.com/KIROsola/p/11131599.html