最大子数组问题(分治法)

问题描述:股票获得最大收益。很难做到最低买入,最高卖出。

暴力求解:简单的尝试对每对可能的买进卖出日期组合,只要卖出日期在买进日期之后即可。

问题变换:不再从每日的价格角度看待输入数据,而是考虑每日价格变化,第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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值