news 2026/4/18 1:57:13

D.二分查找-基础-2529. 正整数和负整数的最大计数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
D.二分查找-基础-2529. 正整数和负整数的最大计数

题目链接:2529. 正整数和负整数的最大计数(简单)

算法原理:

解法:二分查找

模板👇

优选算法-二分:18.在排序数组中查找元素的第一个和最后一个位置

利用题目的按 非递减顺序 排列的条件就可以二分处理了,找到负数的最右端点和正数的最左端点

思路一:将二分查找的值设为定值,间接找到不确定的值

击败100.00%

时间复杂度O(Logn)

目标值定为0,因为0恰好是二段性的节点,因此可以有两种角度看待这个目标值0

①左区间最右端的0:[-5,-3-2-1,0,0,0,0,1,4,5,6]

②右区间最左端的0:[-5,-3-2-1,0,0,0,0,1,4,5,6]

第一次遍历找到 最左端的0 进而找到 最后一个负数 :

二分查找结束后,left和right在0(没有0就在0的右侧),先处理边界情况,看是否全是负数,是0或者正数就正常更新长度即可

第二次遍历找到 最右端的0 进而找到 第一个正数 :

二分查找结束后,left和right在0(没有0就在0的左侧),先处理边界情况,看是否全是正数,是0或者负数就正常更新长度即可

思路二:直接将二分查找的值设为要找的不确定值

击败100.00%

时间复杂度O(Logn)

比思路一好写一些,但是要理解好每一步,这里的if判断是带等号的,因为0不算正数也不算负数,等于0的时候也要相应移动

答疑

Q1:能不能用一次二分就找到最后的负数和第一个正数呢?

能的,比如先找到最后一个负数的位置,然后left右移找到第一个正数的位置,但是不保证时间复杂度一定是logn,因为当数据[-1,0,0,0,0,0,~,0,0,0,2],的时候left一直右移就会将时间复杂度弱化到O(N),所以两次二分还是更稳妥些

Java代码:

class Solution { public int maximumCount(int[] nums) { //利用题目的按 非递减顺序 排列的条件就可以二分处理了 //找到负数的最右端点和正数的最左端点 int n=nums.length; if(n==0) return 0; //利用0来决定二段性:负数 0 正数 //先找最后一个负数(通过最左侧的0来找) int left=0,right=n-1; while(left<right){ int mid=left+(right-left)/2; if(nums[mid]<0) left=mid+1; else right=mid; } //此时在0或者0的右侧(正数) int neg=0; //全是负数 if(nums[left]<0) neg=n; //是0或者正数 else neg=left; //再找第一个正数(通过最右侧的0来找) left=0;right=n-1; while(left<right){ int mid=left+(right-left+1)/2; if(nums[mid]>0) right=mid-1; else left=mid; } //此时在0或者0的左侧 int pos=0; //全是正数 if(nums[left]>0) pos=n; //是0或者负数 else pos=n-(left+1); return Math.max(neg,pos); } }
class Solution { //思路二:直接将二分查找的值设为要找的不确定值 public int maximumCount(int[] nums) { int n=nums.length; if(n==0) return 0; int left=0,right=n-1; //找到负数的最后一个位置 while(left<right){ int mid=left+(right-left+1)/2; if(nums[mid]>=0) right=mid-1; else left=mid; } int neg=nums[left]<0?left+1:0; //找到正数的第一个位置 left=0;right=n-1; while(left<right){ int mid=left+(right-left)/2; if(nums[mid]<=0) left=mid+1; else right=mid; } int pos=nums[left]>0?n-left:0; return Math.max(neg,pos); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 14:58:41

C++起源与核心:版本演进+命名空间法

一、C的发展历史 -我们将C的发展史归纳为节点的形式展示 关键节点&#xff1a; 起源&#xff08;1979–1983&#xff09;&#xff1a;丹麦科学家本贾尼斯特劳斯特卢普在贝尔实验室开发“带类的 C 语言”&#xff0c;旨在为 C 语言添加面向对象特性&#xff0c;1983 年正式命…

作者头像 李华
网站建设 2026/4/16 12:20:00

时间序列分析

时间序列分析&#xff1a;从随机过程理论到 SARIMA 模型构建 一、 时间序列的数学定义与性质 1.1 随机序列与观察值 在数学上&#xff0c;时间序列不仅仅是一组数字&#xff0c;它是一个随机过程&#xff08;Stochastic Process&#xff09;。 设 TTT 为一个时间索引集合&#…

作者头像 李华
网站建设 2026/4/16 12:33:58

【Java数组】--告别困惑快速掌握数组

个人主页 文章目录 前言&#xff1a;1. 数组是什么1.1 数组的特性1.2 数组的内部结构1.3 数组的分类1.4 数组与集合的区别 2. 数组的定义2.1 数组的数学概念2.2 数组的索引机制2.3 数组的边界概念 3. 数组的声明与创建3.1 数组的声明方式3.2 声明与初始化的时机3.3 数组的创建3…

作者头像 李华
网站建设 2026/4/16 21:32:19

13、AWK与正则表达式:数据处理与文本匹配的强大工具

AWK与正则表达式:数据处理与文本匹配的强大工具 1. AWK命令基础 AWK是一个强大的数据处理工具,可用于从文件中过滤和显示内容,尤其适用于处理大文件。我们可以先打印整个文件,以熟悉命令语法,之后再将控制信息添加到AWK文件中,简化命令行操作。 打印整个文件 :使用以…

作者头像 李华
网站建设 2026/4/16 12:20:05

一文吃透随机森林:原理剖析+C++实战实现

哈喽&#xff0c;各位C开发者朋友&#xff01;今天咱们聚焦机器学习领域中经典的集成学习算法——随机森林。它凭借出色的泛化能力、抗过拟合特性以及对非线性数据的适配性&#xff0c;在分类、回归任务中都有着广泛应用&#xff0c;也是面试中的高频考点。这篇文章会从基础原理…

作者头像 李华