LeetCode——152. Maximum Product Subarray
来源:互联网 发布:linux vi移到行尾 编辑:程序博客网 时间:2024/06/05 14:24
问题描述:
Find the contiguous subarray within an array (containing at least one number) which has the largest product.For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6.
题目大致的意思是给你一个数组,要你算连续的子数组乘积的最大值。
一开始看到这道题,很容易就想到暴力拆解的方法,但是说实话,这样子处理起来时间复杂度很高,肯定是不行的。再仔细想想,就想到了动态规划的想法了。很明显在这种数组中求子数组求和或者求积的最大值的题中,肯定是要有个变量来保存最大值,以及有其他变量来在遍历的过程中保存中间值的,这道题就是一个很经典的例子。
数组中只有整数,那就是负整数、正整数还有0三种。如果对数组进行遍历,会遇到这三种数,就对应三种情况吧:
①正整数:正整数×正整数=更大的正整数,而正整数×负整数=更小的负整数这个没问题。
②负整数:负整数×正整数=更小的负整数,而负整数×负整数=更大的正整数。负整数的存在,就意味着我们不可能只需要一个max的中间变量就搞定,而需要一个min,因为无论如何,min×负整数肯定是大于max×正整数的(先排除0的情况),所以我们需要两个中间变量:max、min。
③0:呃,0的出现,让情况变得复杂了许多。无论你min或max是什么,最后×0一定是0,那么如果你后面遍历时还把后面的元素算进前面这个子数组时,已经没有什么意义了,乘积一直都是0。因此,0应该是作为两个子数组间的分界元素,那么我们就要使用一个result来保存中间变量的最大值,最后是要作为返回值返回的。此外,在开始下一个子数组的计算时,前面的max和min肯定是要设为下一个子数组的首元素的,那么这里要怎么处理呢?想一想······
其实很简单,我们只要保存这个0,然后留到下一个开始元素,与开始元素进行比较,那么max和min就可以设为我们想要的首元素的值了。因此,我们的比较表达式是:
max = Math.max(nums[i], nums[i]*max 或者 nums[i]*min) min = Math.min(nums[i], nums[i]*min 或者 nums[i]*max)
解释一下:如果nums[i]是一个非0的数,那么取max或者取min一定是取后面的这个表达式的值;而如果nums[i]是0,那么max和min肯定被置0,在下一步与下一个子数组的首元素进行比较时,就可以将这个首元素赋到max或者min中去。
下面是代码:
public int maxProduct(int[] nums) { int max = nums[0]; int min = nums[0]; int result = nums[0]; for(int i = 1; i < nums.length; i++) { int temp = nums[i]; if(temp < 0) { int tempMin = min; min = Math.min(temp, temp*max); max = Math.max(temp, temp*tempMin); } if(temp >= 0) { max = Math.max(temp, temp*max); min = Math.min(temp, temp*min); } result = Math.max(result, max); } return result; }
总的来说,这道题的核心就是动态规划,要想到使用max和min来保存中间值,然后根据max和result的值来更新所需要的最大值;其次就是在遇到正整数、负整数、0三种情况时分别判断,并做出一个总的处理方法,这道题就可以解决了。
谢谢大家观看我的博客。如果有不明白的地方,或者是文中有错误的地方,欢迎指出,谢谢!如果大家喜欢我的博客,也可以给我点点赞。你们的点赞就是我的动力!
- LeetCode——152. Maximum Product Subarray
- LeetCode—Maximum Product Subarray
- LeetCode——Maximum Product Subarray
- LeetCode——Maximum Product Subarray
- leetcode 152 —— Maximum Product Subarray
- Maximum Product Subarray —— Leetcode
- leetcode——Maximum Product Subarray
- Leetcode—152. Maximum Product Subarray 最小乘积子串
- LeetCode 152. Maximum Product Subarray
- [leetcode] 152.Maximum Product Subarray
- [LeetCode]152. Maximum Product Subarray
- leetcode:152. Maximum Product Subarray
- leetcode 152. Maximum Product Subarray
- 152. Maximum Product Subarray LeetCode
- [leetcode] 152. Maximum Product Subarray
- LeetCode *** 152. Maximum Product Subarray
- LeetCode 152. Maximum Product Subarray
- leetcode.152. Maximum Product Subarray
- Linux网络编程——tcp并发服务器(I/O复用之select
- linux下devicetree中惯用的of函数
- POJ 3162 Walking Race 树的直径+线段树
- HDOJ2639(01背包第k最优解模板题)
- Java多线程系列-happens-before规则和as-if-serial语义
- LeetCode——152. Maximum Product Subarray
- 学习中遇到的中文乱码问题。
- 【SSLGZ 2793】2017年10月26日提高组T2 Deep(博弈)
- Django基本命令 静态文件配置 笔记
- codevs 1052 地鼠游戏 贪心
- 宿主机 Navicat 连接VMware Ubuntu 虚拟机 的MySQL 实现方法
- 第一天
- 627.SWAP Salary
- jsp一些知识点