Leetcode—2529.正整数和负整数的最大计数【简单】二分法!

2023每日刷题(四)

Leetcode—2529.正整数和负整数的最大计数

在这里插入图片描述

遍历法实现代码

int maximumCount(int* nums, int numsSize){
    int i;
    int neg = 0, pos = 0;
    for(i = 0; i < numsSize; i++) {
        if(nums[i] < 0) {
            neg++;
        }
        if(nums[i] > 0) {
            pos++;
        }
    }
    return (neg > pos) ? neg : pos;
}

测试结果

在这里插入图片描述

二分法思想

本质是循环不变量

图片源于灵茶山艾府
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

int lower_bound(int *nums, int numsSize, int target) {
    int left = 0;
    int right = numsSize - 1;   // 闭区间[left, right]
    int mid;
    while(left <= right) {      //区间不为空
        mid = left + (right - left) / 2;
        if(nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left; 	// 也可以是right + 1
}


int lower_bound2(int *nums, int numsSize, int target) {
    int left = 0;
    int right = numsSize;   // 左闭右开区间[left, right)
    int mid;
    while(left < right) {      //区间不为空
        mid = left + (right - left) / 2;
        if(nums[mid] < target) {
            left = mid + 1;     // [mid + 1, right)
        } else {
            right = mid;    // [left, mid)
        }
    }
    return left;     //return right也可以,因为right和left都指向同一个数了
}

int lower_bound3(int *nums, int numsSize, int target) {
    int left = -1;
    int right = numsSize;   // 开区间(left, right)
    int mid;
    while(left+1 < right) {      //区间不为空
        mid = left + (right - left) / 2;
        if(nums[mid] < target) {
            left = mid;     // (mid, right)
        } else {
            right = mid;    // (left, mid)
        }
    }
    return right;      // 也可以是left + 1
}

int maximumCount(int* nums, int numsSize){
    int i;
    int neg = 0, pos = 0;
    // int tmp = lower_bound(nums, numsSize, 0);
    // int tmp = lower_bound2(nums, numsSize, 0);
    int tmp = lower_bound3(nums, numsSize, 0);
    neg = tmp;
    // tmp = lower_bound(nums, numsSize, 1);
    // tmp = lower_bound2(nums, numsSize, 1);
    tmp = lower_bound3(nums, numsSize, 1);
    if(tmp == numsSize) {
        pos = 0;
    } else {
        pos = numsSize - tmp;
    }
    return (neg > pos) ? neg : pos;
}

使用lower_bound()、lower_bound2()还是lower_bound3()都能成功,这里只是提供三种二分查找函数,我更偏向于第二种

测试结果

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值