程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(1)

子序列问题

发布于2019-12-07 17:14     阅读(848)     评论(0)     点赞(29)     收藏(2)


最近做了两道子序列问题,分别是

53、最大子序列和和152、乘积最大子序列

他们解决的办法大致相同,都是经过一次遍历保存一个遍历到当前数字的最大值,然后保留一个当前增益或但当前成绩,于是放到一起做一个总结。

53、最大子序列和(来自leetcode题解)

动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
每次比较 sum 和 ans的大小,将最大值置为ans,遍历结束返回结果
时间复杂度:O(n)

  1. class Solution {
  2. public int maxSubArray(int[] nums) {
  3. int ans = nums[0];
  4. int sum = 0;
  5. for(int num: nums) {
  6. if(sum > 0) {
  7. sum += num;
  8. } else {
  9. sum = num;
  10. }
  11. ans = Math.max(ans, sum);
  12. }
  13. return ans;
  14. }
  15. }

152、乘积最大子序列

这道题值只是跟上一道略有不同。

令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i], nums[i])
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,imin = min(imin * nums[i], nums[i])
当负数出现时则imax与imin进行交换再进行下一步计算
时间复杂度:O(n)

  1. class Solution:
  2. def maxProduct(self, nums: List[int]) -> int:
  3. maxx,imax,imin=float('-inf'), 1, 1
  4. for num in nums:
  5. if num<0:
  6. imax, imin = imin, imax
  7. imax = max(imax*num,num)
  8. imin = min(imin*num,num)
  9. maxx=max(maxx,imax)
  10. print(maxx,imax,imin)
  11. return maxx

 



所属网站分类: 技术文章 > 博客

作者:短发越来越短

链接:https://www.pythonheidong.com/blog/article/170165/b786068a225250509ca4/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

29 0
收藏该文
已收藏

评论内容:(最多支持255个字符)