力扣-2529. 正整数和负整数的最大计数

文章目录

力扣题目

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

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

注意: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 。

提示:

1 <= nums.length <= 2000

-2000 <= nums[i] <= 2000

nums 按 非递减顺序 排列。

代码工程

理解本题最好先看一下力扣-34题有助于理解。

思路分析;

1.第一步找出大于0数字的最左边的位置;

2.第二步找出小于0数字的最右边的位置;

3.第三步判断数组中是否只含有正数或者只含有负数,如果是则对应的个数赋值为0;如果不是就按照代码中的逻辑求出对应的个数再比较大小。

补充一句:如果遍历去做这道题还是比较容易的,使用二分查找锻炼一下逻辑。

cpp 复制代码
class Solution {
public:
    int maximumCount(vector<int>& nums) 
    {
       int left = 0, right = nums.size() - 1;
        int max_pos = INT_MAX, min_pos = INT_MIN; /*最大负数的位置,最小正数的位置*/
        int num1 = 0, num2 = 0;
        /*特殊情况,数组中的元素全是0*/
        if (nums[left] == 0 && nums[right] == 0)
        {
            return 0;
        }

        /*找到最小正数的位置*/
        while (left <= right)
        {
            int mid = left + (right - left) / 2;
            if (nums[mid] > 0)
            {
                min_pos = mid;
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }

        left = 0;
        right = nums.size() - 1;

        /*找到最大负数的位置*/
        while (left <= right)
        {
            int mid = left + (right - left) / 2;
            if (nums[mid] < 0)
            {
                max_pos = mid;
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
        /*求出正数和负数的对应个数*/
        if (min_pos == INT_MIN)/*没有正数*/
        {
            num1 = 0;
        }
        else
        {
            num1 = nums.size() - min_pos;/*正数的个数*/
        }
        
        if (max_pos == INT_MAX)/*没有负数*/
        {
            num2 = 0;
        }
        else
        {
            num2 = max_pos + 1;/*负数的个数*/
        }

        return max(num1, num2);
    }
};
相关推荐
smj2302_796826525 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
_深海凉_8 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录9 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre12 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre14 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia14 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙98016 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia18 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947319 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊19 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode