leetcode笔记 - 275.H指数II (H-Index II)

Leetcode 275. H-Index II
没想到这个题也可以用二分法做,真是惊喜,可能自己做的题还不够,一时没想到用二分法,就感觉很有意思 哈哈哈

我的第一想法
有顺序嘛,那就从开头一直向后找 哈哈哈 暴力,咦 难怪最近看新闻报道某厂 男 暴力女友,哎 算法题做多了呗,算法不提倡暴力,生活也不提倡哈 生活不易 请有缘人互相珍惜呀。

class Solution {
    public int hIndex(int[] citations) {
        int i = 0;
        while(i < citations.length){
            if (citations[i] >= citations.length -i){
                break;
            }
            i++;
        }
        return citations.length - i;
    }
}

二分法解决下:

class Solution {
    public int hIndex(int[] citations) {
        int l = 0;
        int r = citations.length - 1;
        while(l <= r){
            int mid = l + (r-l)/2;
            if(citations[mid] == citations.length - mid){
                return citations.length - mid;
            }
            else if (citations[mid] > citations.length - mid){
                r = mid - 1;
            }else{
                l = mid + 1;
            }            
        }
        return citations.length - l;
    }   
}

二分法另一种格式
图片有误,请看下面分析
在这里插入图片描述
这里需要注意 一丢丢
注意 :

  • 我们可以取到的边界值是多少?
  • 如下图片和上面👆代码 有点却别,当我们最右边边界取到数组的长度时,那么我们注意,citations[citations.length] 是越界的,也就是说,l是不能取到 r的 即 l < r
  • 在后面r = mid 我们不能 再减 1 了。举例说明:
    数组 [0,3], l = 0, r = 2,
    第一次循环:
    mid = 1, 3 > (2-1), 执行 else语句,r = 0;
    第二次循环,不满足条件,循环结束。

分析: r = 2 —> r = 0, 遗漏调 r = 1 所以不可以 使用 r = mid -1.

正确写法:

class Solution {
    public int hIndex(int[] citations) {
        int l = 0;
        int r = citations.length;
        while(l < r){
            int mid = l + (r-l)/2;
            if(citations[mid] == citations.length - mid){
                return citations.length - mid;
            }
            else if (citations[mid] < citations.length - mid){
                l = mid + 1;
            }else{
                r = mid;
            }            
        }
        return citations.length - l;
    }   
}

谢谢观赏
若有误,欢迎批评指正

记录随笔❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值