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

2023每日刷题(四)

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

Leetcode—2529.正整数和负整数的最大计数【简单】_第1张图片

遍历法实现代码

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;
}

测试结果

Leetcode—2529.正整数和负整数的最大计数【简单】_第2张图片

二分法思想

本质是循环不变量

图片源于灵茶山艾府
Leetcode—2529.正整数和负整数的最大计数【简单】_第3张图片
Leetcode—2529.正整数和负整数的最大计数【简单】_第4张图片
Leetcode—2529.正整数和负整数的最大计数【简单】_第5张图片

实现代码

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;
}


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;      
}

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()都能成功,这里只是提供三种二分查找函数,我更偏向于第二种

测试结果

Leetcode—2529.正整数和负整数的最大计数【简单】_第6张图片

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

你可能感兴趣的:(LeetCode刷题,leetcode,算法,经验分享,c语言,二分查找)