当前位置: 首页 > news >正文

监控视频做直播网站myeclipse做网站更改名字

监控视频做直播网站,myeclipse做网站更改名字,wordpress主题微博,wordpress表白152. 乘积最大子数组 题目描述: 给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积 思路1:贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数,所以多乘一些数肯定不会让绝…

152. 乘积最大子数组

题目描述:

给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积

思路1:贪心

由于 n u m s [ i ] nums[i] nums[i]都是整数,所以多乘一些数肯定不会让绝对值变小,所以我们就要尽可能多乘一些数

首先,我们考虑最简单的例子,也就是不包含0的情况:

  • 统计负数的数量,如果是偶数,那直接返回所有数的乘积即可
  • 如果负数的数量是奇数,我们就考虑删掉一个负数,由于我们上面说过,多乘一些数不会让乘积的绝对值变小,所以我们要尽可能少删数,从左往右找到第一个,下标为id1,从右往左找到第一个,下标为id2,要么是删id1往左的所有数,要么是删id2往右的所有数,两种情况取最大值就行
  • 你可能会怀疑,为什么答案不可能是被删除的那一段,因为被删除的那一段都在另一半计算过了,删id1往左的所有数时,这段在计算删id2往右的所有数时,被计算过了
class Solution {
public:int fuck(int l, int r, vector<int>nums){if(l > r || l < 0 || r >= nums.size())return -2e9;if(l == r)return nums[l];int mul = 1;for(int i = l; i <= r; ++i)mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){for(int i = l; i <= r; ++i)mul *= nums[i];return mul;}mul = -1;int id1 = -1, id2 = -1;for(int i = l; i <= r; ++i){mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){id1 = i;break;}}int ans1 = 1, ans2 = 1;for(int i = id1 + 1; i <= r; ++i){ans1 *= nums[i];}mul = -1;for(int i = r; i >= l; --i){mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){id2 = i;break;}}for(int i = id2 - 1; i >= l; --i){ans2 *= nums[i];}return max(ans1, ans2);}int maxProduct(vector<int>& nums) {vector<int>v;for(int i = 0; i < nums.size(); ++i){if(nums[i] == 0)v.push_back(i);}if(v.empty())return fuck(0, nums.size() - 1, nums);int ans = 0;v.push_back(nums.size());int pre = -1;for(int i = 0; i < v.size(); ++i){ans = max(ans, fuck(pre + 1, v[i] - 1, nums));pre = v[i];}return ans;}
};

思路2:DP

这题和最大子数组和的题型有一点像,但是不可以像它那样去进行转移,不能仅仅维护一个最大值,这样会忽略偶数个负数乘起来也是正数的情况,有一种局部贪心的感觉

所以还需要维护一个最小值

  • 状态:

    • m a x n [ i ] maxn[i] maxn[i]表示以 n u m s [ i ] nums[i] nums[i]结尾的子数组乘积的最大值
    • m i n x [ i ] minx[i] minx[i]表示以 n u m s [ i ] nums[i] nums[i]结尾的子数组乘积的最小值
  • 转移方程:

    • n u m [ i ] > 0 num[i] > 0 num[i]>0

      • m a x n [ i ] = m a x ( n u m s [ i ] , m a x n [ i − 1 ] ∗ n u m s [ i ] ) ; maxn[i] = max(nums[i], maxn[i - 1] * nums[i]); maxn[i]=max(nums[i],maxn[i1]nums[i]);
      • m i n x [ i ] = m i n ( m i n x [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; minx[i] = min(minx[i - 1] * nums[i], nums[i]); minx[i]=min(minx[i1]nums[i],nums[i]);
    • n u m [ i ] < 0 num[i] < 0 num[i]<0

      • m a x n [ i ] = m a x ( m i n x [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; maxn[i] = max(minx[i - 1] * nums[i], nums[i]); maxn[i]=max(minx[i1]nums[i],nums[i]);
      • m i n x [ i ] = m i n ( m a x n [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; minx[i] = min(maxn[i - 1] * nums[i], nums[i]); minx[i]=min(maxn[i1]nums[i],nums[i]);

为了解决数据加强的问题,可以用double卡过去

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<double>maxn(n), minx(n);double ans = nums[0];maxn[0] = minx[0] = nums[0];for(int i = 1; i < n; ++i){if(nums[i] > 0){maxn[i] = max((double)nums[i], maxn[i - 1] * nums[i]);minx[i] = min(minx[i - 1] * nums[i], (double)nums[i]);}else if(nums[i] < 0){maxn[i] = max(minx[i - 1] * nums[i], (double)nums[i]);minx[i] = min(maxn[i - 1] * nums[i], (double)nums[i]);}ans = max(ans, maxn[i]);}return (int)ans;}
};
http://www.yayakq.cn/news/572897/

相关文章:

  • 建筑网站大全导航岳阳市交通建设投资公司门户网站
  • 公司网站点击量如何看wordpress添加网页背景图片大小
  • 深圳教育平台网站建设公众号平台官网网页版
  • 两学一做 知识竞赛网站做阀门网站
  • 设计素材网站会员哪个最好微信公众号端网站开发
  • 免费不收费网站有哪些手机版网站建站
  • 计算机专业设计一个网站微信上的小说网站是怎么做的
  • 手机管理网站模板刹车片图纸网站建设
  • 济南高端定制网站建设项目宣传推广方案
  • 公司做网络宣传哪个网站比较好wordpress版块插件
  • 网站建设项目费用报价搭建网站免费空间
  • wordpress编辑器汉seo关键词优化推广报价表
  • 企业网站建设网站制作建设ftp网站怎么创建数据库
  • 佛山企业网站建设山东泰山比赛直播
  • 网站新闻图片尺寸网站 设计理念
  • 做网站的哪家公司好如何做网页图片
  • 外贸企业网站源码如何进行网站改版设计
  • 网站标题可以修改吗资金盘网站开发费用
  • 西安学校部门定制网站建设公司比较好的友链平台
  • 做视频网站适合用什么服务器12306网站谁建设的
  • 正在建设中网站如何生成自己的小程序
  • 八亿wap建站怎么注册公司的流程和费用
  • 手机网站php开发直播间网站开发制作
  • 廊坊cms建站模板网站整合营销建设
  • 深圳蚂蚁网络网站建设网站设计内容包括
  • 石家庄做网站排名郑州seo线上推广系统
  • 广州市 住房建设局网站首页自动优化句子的软件
  • 百度图片点击变网站是怎么做的云南网站建设企业
  • 问卷调查网站赚钱长春新闻最新消息
  • 东莞网站定制上海金融网站建设公司