LeetCode 分类刷题:2529. 正整数和负整数的最大计数

题目

给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。

  • 换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 posneg二者中的最大值。

注意: 0 既不是正整数也不是负整数。

示例 1:

复制代码
输入:nums = [-2,-1,-1,1,2,3]
输出:3
解释:共有 3 个正整数和 3 个负整数。计数得到的最大值是 3 。

示例 2:

复制代码
输入:nums = [-3,-2,-1,0,0,1,2]
输出:3
解释:共有 2 个正整数和 3 个负整数。计数得到的最大值是 3 。

示例 3:

复制代码
输入:nums = [5,20,66,1314]
输出:4
解释:共有 4 个正整数和 0 个负整数。计数得到的最大值是 4 。

解析

LeetCode 分类刷题:34. 在排序数组中查找元素的第一个和最后一个位置-CSDN博客 思路类似

利用二分查找寻找0元素,采用开区间做法,那么退出循环时:

left指针指向数组中小于0的数的最后一个位置,right指针指向大于等于0的数的第一个位置,然后移动right指针到大于0的数的第一个位置。

此时,小于0的数一共left + 1个,大于0的数一共 len(nums) - 1 - right + 1 = len(nums) - right 个。

再返回二者中的较大者。

答案

python 复制代码
class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        left, right = -1, len(nums)
        while left + 1 < right:    # left+1 = right时,开区间(left, right)不包含任何整数
            mid = (left + right) // 2
            if nums[mid] < 0:
                left = mid
            else:
                right = mid    # 退出循环时,left指向最后一个负数,right指向第一个非负数
        while right < len(nums) and nums[right] == 0:    # 跳过0,找到第一个正数
            right += 1
        return left + 1 if left + 1 > len(nums) - right else len(nums) - right

复杂度分析

时间复杂度:O(n)

该算法主要由两部分组成:二分查找和线性扫描。二分查找部分用于定位最后一个负数的位置,时间复杂度为 O(log n),其中 n 是数组的长度。线性扫描部分用于跳过连续的零,找到第一个正数,最坏情况下需要遍历整个数组,时间复杂度为 O(n)。

但是实际运行时间还是比遍历数组统计正负数个数的方法快很多。

空间复杂度:O(1)

优化

  • bisect()和bisect_right()等同
  • bisect.bisect和bisect.bisect_right返回大于x的第一个下标(相当于C++中的upper_bound)
  • bisect.bisect_left返回大于等于x的第一个下标(相当于C++中的lower_bound)。
python 复制代码
class Solution:
    def maximumCount(self, nums: List[int]) -> int:
        neg = bisect_left(nums, 0)
        pos = len(nums) - bisect_right(nums, 0)
        return max(neg, pos)

# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/maximum-count-of-positive-integer-and-negative-integer/
# 来源:力扣(LeetCode)
相关推荐
小熊出擊12 分钟前
【pytest】使用 marker 向 fixture 传递数据
python·pytest
Dest1ny-安全16 分钟前
Java代码审计-Servlet基础(1)
java·python·servlet
好开心啊没烦恼28 分钟前
Python数据分析:使用爬虫从网页、社交媒体平台、论坛等公开资源提取中文和英文人名。
开发语言·爬虫·python·数据挖掘·数据分析
雨夜的星光29 分钟前
Python环境管理工具全景对比:Virtualenv, Pipenv, Poetry 与 Conda
python·pycharm·conda·virtualenv
Mr.Ja44 分钟前
【LeetCode 热题 100】No.49—— 字母异位词分组(Java 版)
java·算法·leetcode·字母异位词分组
未知陨落1 小时前
LeetCode:99.下一个排列
算法·leetcode
2401_841495641 小时前
【数据结构】链栈的基本操作
java·数据结构·c++·python·算法·链表·链栈
Archie_IT1 小时前
「深入浅出」嵌入式八股文—P2 内存篇
c语言·开发语言·数据结构·数据库·c++·算法
是那盏灯塔1 小时前
【算法】——动态规划算法及实践应用
数据结构·c++·算法·动态规划
猫头虎2 小时前
如何解决 pip install -r requirements.txt 本地轮子路径 ‘./packages/xxx.whl’ 不存在 问题
开发语言·网络·python·r语言·pip·gpu算力·国产