题解 | #子数组最大乘积#

子数组最大乘积

http://www.nowcoder.com/practice/9c158345c867466293fc413cff570356

算法思想一:暴力法

解题思路:

对于求解子数组的最大乘积,只需要按照子数组的大小,进行遍历,最后记录最大乘积,输出结果即可

1、只包含一个元素,直接返回该元素;
2、包含两个或两个以上元素,暴力循环求乘积最大的连续子数组,返回乘积。

代码展示:

Python版本

class Solution:
    def maxProduct(self , arr ):
        # write code here
        # 整数数组 nums 只包含一个元素
        if len(arr) == 1:
            return float(arr[0])
        # 记录整数数组 arr 中乘积最大的连续子数组的乘积
        maxres = arr[0]
        for i in range(len(arr)):
            # curmax 记录整数数组 arr 中当前乘积最大的连续子数组的乘积
            curmax = 1
            for j in range(i, len(arr)):
                curmax *= arr[j]
                # 不断更新 arr 中乘积最大的连续子数组的乘积 maxres
                maxres = max(maxres, curmax)
        return float(maxres)

复杂度分析

时间复杂度:N表示数组的长度,两遍循环时间

空间复杂度:仅使用常数级空间变量

算法思想二:动态规划

解题思路:

算法一时间复杂度较高,采用动态规划方法进行优化

算法流程:

1、遍历数组时计算当前最大值,不断更新
2、令imax为当前最大值,则当前最大值为
3、由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值
4、当负数出现时则imax与imin进行交换再进行下一步计算
图解:

代码展示:

JAVA版本

import java.lang.Math;
public class Solution {
    public double maxProduct(double[] arr) {
        // 初始化
        double max = Integer.MIN_VALUE, imax = 1, imin = 1;
        // 遍历数组内元素
        for(int i=0; i<arr.length; i++){
            // 交换最大最小值
            if(arr[i] < 0){ 
              double tmp = imax;
              imax = imin;
              imin = tmp;
            }
            // 更新最小 最大值,防止出现负数的情况
            imax = Math.max(imax*arr[i], arr[i]);
            imin = Math.min(imin*arr[i], arr[i]);
            // 寻找最大值
            max = Math.max(max, imax);
        }
        return max;
    }
}

复杂度分析

时间复杂度:N表示数组的长度,遍历一次数组时间

空间复杂度:仅使用常数级空间变量

全部评论

相关推荐

05-12 10:10
已编辑
门头沟学院 人工智能
写这篇之前我犹豫了挺久。一方面是怕被人骂,&quot;又一个收割焦虑的转行帖&quot;;另一方面是看了太多用&nbsp;GPT&nbsp;套娃出来的「学习路线」文章,AI&nbsp;味重得让人没法读完。所以这篇全是亲身踩过的坑,时间线、用过的项目、当时的心路全都尽量原样写出来。如果你是大学生在迷茫要不要转&nbsp;AI,或者已经在转的路上,希望能给点参考。&nbsp;一个反共识的开场:你以为进&nbsp;OpenAI&nbsp;的人都是博士?&nbsp;先讲个故事,跟我没关系,但跟所有想转&nbsp;AI&nbsp;的人都有关系。&nbsp;OpenAI&nbsp;的&nbsp;Sora&nbsp;团队(就是搞文生视频那个)一共&nbsp;13&nbsp;个人。这里面有两个人特别有意思:&nbsp;Will&nbsp;DePue,密歇根大学计算机系,直接辍学了。17...
_hengheng:我也本,也算是做ai相关,我最开始感觉做ai工程师有多么多么困难,后来发现懂了原理后整体训练完全可以看成一个流程化的内容,开源方案太多了,大多基本都是按着模子在自家业务上做各种操作,就算是大厂的小部门也没那么多资源去训基模,反而更多的是像怎么把技术往业务方向靠近了,不过当前时代如果本科学历没那么好加上自己执行力不是特别强还真不建议走ai工程师这条路,可以试试其他ai的偏业务方向,不然校招不太好杀出来
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务