JS刷题!双指针1-最大乘积区间问题

176 阅读3分钟

1. 题目来源

稀土掘金~双指针No.97~最大乘积区间问题(简单) - MarsCode

2. 解题思路

题目要求

找到数组中一段连续区间的最大乘积,并返回该区间的起始和结束位置。如果存在多个区间乘积相同的情况,优先选择起始位置 x 更小的区间;如果 x 相同,选择结束位置 y 更小的区间。

  1. 初始化maxProduct用于存储当前找到的最大乘积;result用于存储对应的区间
  2. 遍历数组:使用外层循环遍历数组中的每一个元素作为起点,计算后续元素的乘积
  3. 计算乘积:使用内层循环从当前起点开始,计算后续元素的乘积
  4. 更新最大乘积及其区间:在计算过程中,如果发现某个区间的乘积大于当前的最大乘积,则更新最大乘积及其对应的区间。
  5. 特殊情况:如果遇到0,直接跳过后续元素,因为乘积会变为0

3. 题解

function solution(n, arr) {
    // Edit your code here
    // 初始化最大乘积为负无穷,以便后续更新最大值
    let maxProduct = -Infinity;
    // 存储最大乘积区间的起始和结束位置,初始化为 [-1,-1]
    let result = [-1,-1];
    // 遍历数组中的每个元素作为起点
    for(let i = 0;i < n;i++){
        // 初始化从当前起点开始的乘积为 1
        let product = 1;
        // 从当前起点开始向后遍历,计算连续元素的乘积
        for(let j = i;j < n;j++){
            // 计算当前元素的乘积
            product *= arr[j];
            // 如果当前乘积大于最大乘积
            if(product > maxProduct){
                // 更新最大乘积和结果区间
                maxProduct = product;
                result = [i + 1,j + 1];
            }else if(product === maxProduct){
                // 如果当前乘积等于最大乘积,根据起始位置和结束位置的规则更新结果
                if(i + 1 < result[0]||(i + 1 === result[0] && j + 1 < result[1])){
                    result = [i + 1,j + 1];
                }
            }
            // 如果遇到 0,则后续乘积都为 0,停止内层循环
            if(arr[j] === 0){
                break;
            }
        }
    }
    return result;
}

function main() {
    // Add your test cases here
    console.log(solution(5, [1, 2, 4, 0, 8]).toString() === [1, 3].toString());
    console.log(solution(7, [1, 2, 4, 8, 0, 256, 0]).toString() === [6, 6].toString());
}

main();

4. 关于豆包MarsCode

4.1 推荐使用!

豆包MarsCode简单方便,上手快,能应对日常的编程任务,刷题时也能给你提供不错的解题思路和示例代码,很适合新手和老手,大大提高了工作效率;所以个人挺推荐使用豆包MarsCode去辅助开发!

4.2 HowieCong与MarsCode的经历

  1. 线上参加过两次的字节跳动 X 豆包MarsCode的青训营,积极参与其中,搭配着MarsCode去刷算法题和项目开发真能学到很多
  2. 线下在参加Pycon China 2024上海站时看到了MarsCode参展,MarsCode团队成员非常热情的,拿到了MarsCode的一些周边

❓其他

1. 疑问与作者HowieCong声明

  • 如有疑问、出错的知识,请及时点击下方链接添加作者HowieCong的其中一种联系方式或发送邮件到下方邮箱告知作者HowieCong

  • 若想让作者更新哪些方面的技术文章或补充更多知识在这篇文章,请及时点击下方链接添加里面其中一种联系方式或发送邮件到下方邮箱告知作者HowieCong

  • 声明:作者HowieCong目前只是一个前端开发小菜鸟,写文章的初衷只是全面提高自身能力和见识;如果对此篇文章喜欢或能帮助到你,麻烦给作者HowieCong点个关注/给这篇文章点个赞/收藏这篇文章/在评论区留下你的想法吧,欢迎大家来交流!

2. 作者社交媒体/邮箱-HowieCong