力扣乘积最大子数组
- IT业界
- 2025-09-08 09:36:01

动态规划,注意负负得正,dp交换。
题目
注意这里的dp的乘积要求最大,而两个很大的负数相乘也是大的,因此在每遍历到一个数时要存一个最大值的dp与一个最小值的dp,然后遍历完后再去存ans的dp。由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值。
时间复杂度: O(n),空间复杂度: O(1)。
class Solution { public int maxProduct(int[] nums) { int ans = Integer.MIN_VALUE, imax = 1, imin = 1; for(int i=0; i<nums.length; i++){ if(nums[i] < 0){ // 负数交换,这样每次循环后,imax最大,imin最小 int tmp = imax; imax = imin; imin = tmp; } imax = Math.max(imax*nums[i], nums[i]);//维护大的 imin = Math.min(imin*nums[i], nums[i]);//维护小的 ans = Math.max(ans, imax); } return ans; } }动态规划题还是要多练。
上一篇
如何画产品功能图、结构图
下一篇
论文解读之DeepSeekR1