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

Leetcode.1567 乘积为正数的最长子数组长度

题目链接

Leetcode.1567 乘积为正数的最长子数组长度 Rating : 1710

题目描述

给你一个整数数组 nums,请你求出乘积为正数的最长子数组的长度

一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。

请你返回乘积为正数的最长子数组长度

示例 1:

输入:nums = [1,-2,-3,4]
输出:4
解释:数组本身乘积就是正数,值为 24 。

示例 2:

输入:nums = [0,1,-2,-3,-4]
输出:3
解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。
注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数。

示例 3:

输入:nums = [-1,-2,-3,0,1]
输出:2
解释:乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3] 。

提示:

  • 1<=nums.length<=1051 <= nums.length <= 10^51<=nums.length<=105
  • −109<=nums[i]<=109-10^9 <= nums[i] <= 10^9109<=nums[i]<=109

分析:

首先,要想子数组的乘积为正数,那么子数组里面一定不包含 0,而且负数的个数为偶数

  • 我们用 positive记录 正数 的个数
  • 我们用negative记录 负数 的个数
  • 我们用neg_pos(初始为 -1)记录 第一个负数出现的位置

在遍历的过程中,会遇到以下三种情况:

  • nums[i] > 0,遇到正数 positive+1
  • nums[i] < 0,遇到负数 negative+1,如果此时 neg_pos == -1,说明 nums[i]是目前遇到的第一个负数,更新 neg_pos = i
  • nums[i] == 0,遇到 0positve重置为 0negative重置为 0neg_pos重置为 -1。相当于 0把每一个合法的子数组都截开了。

在更新答案ans的时候:

  • 如果当前子数组中的负数个数是偶数个,即 negative % 2 == 0ans = max(ans , positive + negative),即当前整个子数组乘积都是正数。
  • 如果当前子数组中的负数个数是奇数个,即 negative % 2 != 0,那么当前子数组就需要剔除一个负数来保证整个子数组乘积为正数,我们就选择剔除 第一个出现的负数。即 ans = max(ans , i - neg_pos),剔除了 下标为neg_pos的负数。

时间复杂度:O(n)O(n)O(n)

C++代码:

class Solution {
public:int getMaxLen(vector<int>& nums) {int positive = 0,negative = 0,neg_pos = -1;int ans = 0;int n = nums.size();for(int i = 0;i < n;i++){int x = nums[i];if(x > 0) positive++;else if(x < 0){negative++;if(neg_pos == -1) neg_pos = i;}else{positive = 0;negative = 0;neg_pos = -1;}if(negative % 2 == 0) ans = max(ans,negative + positive);else ans = max(ans,i - neg_pos);}return ans;}
};

Java代码:

class Solution {public int getMaxLen(int[] nums) {int positive = 0;int negative = 0;int neg_pos = -1;int n = nums.length;int ans = 0;for(int i = 0;i < n;i++){int x = nums[i];if(x > 0) positive++;else if(x < 0){negative++;if(neg_pos == -1) neg_pos = i;}else{positive = 0;negative = 0;neg_pos = -1;}if(negative % 2 == 0) ans = Math.max(ans,negative + positive);else ans = Math.max(ans,i - neg_pos);}return ans;}
}
http://www.lryc.cn/news/19289.html

相关文章:

  • 部分库与使用方法总结(自用)
  • C++实现日期类
  • 想成为一名专业黑客,但不知道从哪里学起?我来教你。
  • VMware ESXi 7.0 U3k Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  • 新的计算方法:预测益生菌在不同生长条件下的相互作用
  • python自学之《21天学通Python》(13)——第16章 数据库编程
  • [架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计
  • 电阻串联的作用
  • leetcode 1675. Minimize Deviation in Array(最小化数组偏差)
  • 特征向量中心度(eigenvector centrality)算法原理与源码解析
  • Vue3 中组件的使用(上)
  • spring-boot、spring-cloud、spring-cloud-alibaba版本对应
  • 【沐风老师】3DMAX一键楼梯脚本插件StairGenerator使用教程
  • OpenShift 简介
  • netty自定义封包实现
  • ORA error集锦
  • 格雷码的实现
  • 快到金3银4了,准备跳槽的可以看看
  • 最新BlackArch发布,提供1400款渗透测试工具
  • 重走前端路JS进阶篇:This 指向与箭头函数
  • Python基础:函数式编程
  • 【YBT2023寒假Day14 C】字符串题(SAM)(树链剖分)(线段树)
  • Tailwind CSS 在Vue中的使用
  • 三层楼100人办公网络如何规划设计实施(实战案例)
  • Redis:实现全局唯一ID
  • webpack打包基本原理——实现webpack打包核心功能
  • git的使用(终端输入指令) 上
  • react定义css样式,使用less,css模块化
  • 基于JavaWeb的学生管理系统
  • win11右键新建菜单添加选项