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;
}
}
谢谢观赏
若有误,欢迎批评指正
记录随笔❤️