【路飞】274. H 指数、56. 合并区间

216 阅读3分钟

274. H 指数

给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。

根据维基百科上 h 指数的定义:h 代表“高引用次数”,一名科研人员的 h指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。

如果 h 有多种可能的值,h 指数 是其中最大的那个。

示例 1:

输入:citations = [3,0,6,1,5]
输出:3 
解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。
     由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3

示例 2:

输入: citations = [1,3,1]
输出: 1

解题思路:这题的解题思路是,先将数组排序,然后从最大开始遍历,假如引用最多的h是1,然后依次遍历,当引用的次数大于当前引用量的就是符合的h指数,代码如下:

var hIndex = function(citations) {
    //先将数组排序
    citations.sort(function(a,b){
        return a - b;
    })
    let h = 1
    //从尾部来说遍历数组,直到不满足引用量大于等于h指数结束
    for(let i = citations.length - 1; i >= 0; i --){
        if(citations[i] >= h) h ++;
    }
    //因为是从1开始的,所以需要减一
    return h -1;
};

56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题思路:本题可以将每个区间看错左区间是1,右区间是-1,然后将intervals所有左右区间拆分出来排序,然后求相加,当等于0 的时候就是一个完整的左右区间,比如[[1,3],[2,6],[8,10],[15,18]]拆分后就是ans ={1:1,2:1,3:-1,6:-1,8:1,10:-1,15:1,18:-1},如果用数组表示的话就是ans = [ <1 empty item>, 1, 1, -1, <2 empty items>, -1, <1 empty item>, 1, <1 empty item>, -1, <4 empty items>, 1, <2 empty items>, -1 ],类似<1 empty item>这种的就是不存在数,然后遍历数组ans 累计,等于0就是一个完整的区间,代码如下

var merge = function(intervals) {
    //记录每个左右区间是1还是-1
    let ans = [];
    //记录完整的区间
    let temp = [];
    //将左右区间拆分成,左区间是1,右区间是-1
    for(let i = 0; i < intervals.length; i ++){
        let [a,b] = intervals[i];
        if(ans[a]) ans[a] += 1;
        else ans[a] = 1;
        if( ans[b] < 0 || ans[b] > 0) ans[b] += -1;
        else ans[b] = -1;     
    }
    let sum = 0,pre = -1;
    //sum记录累计值,等于0 ,就是一个完整的值,pre记录的是第一个左边区间
    for(let i in ans){
        if(pre == -1) pre = i;
        sum += ans[i]
        if(sum == 0){
            temp.push([pre,i]);
            pre = -1;
        } 
    }
    return temp;
};