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