算法题——最大(连续)子序列乘积
参考July博客:最大连续子序列乘积
先考虑不连续的
思路:一维动态规划
考虑到乘积子序列中有正有负也还可能有0,可以把问题简化成这样:
- 数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的情况)。
- 虽然只要一个最大积,但由于负数的存在,也要记录最小乘积。碰到一个新的负数元素时,最小乘积相乘之后得到最大值。
代码:
1 int maxSuccessiveProduct(int num[], int n)
2 {
3 if(n < 1)
4 return INT_MIN;
5
6 int max_prod = num[0], min_prod = num[0];
7 int max_res = max_prod;
8
9 for(int i = 1; i < n; ++i)
10 {
11 int cur_prod1 = max_prod * num[i];
12 int cur_prod2 = min_prod * num[i];
13
14 max_prod = max(max_prod, max(cur_prod1, cur_prod2));
15 min_prod = min(min_prod, min(cur_prod1, cur_prod2));
16
17 max_res = max(max_prod, min_prod);
18 }
19
20 return max_res;
21 }
再考虑连续的
思路:
和不连续的差不多,不过要同时记录当前子串的最大/最小乘积,如果最大的乘积<当前值,则开始新的子串。
代码:
1 int maxProduct(int A[], int n) {
2 int maxEnd = A[0];
3 int minEnd = A[0];
4 int maxResult = A[0];
5
6 for (int i = 1; i < n; ++i)
7 {
8 int end1 = maxEnd * A[i], end2 = minEnd * A[i];
9 maxEnd = max(max(end1, end2), A[i]); //和上面的不同在于,外层max的另一个参数是当前元素值
10 minEnd = min(min(end1, end2), A[i]);
11 maxResult = max(maxResult, maxEnd);
12 }
13 return maxResult;
14 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端