题目名称

给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

注意: x 不必 是 nums 的中的元素。

如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 。

示例

输入:nums = [3,5]
输出:2
解释:有 2 个元素(3 和 5)大于或等于 2 。

题解

这道题可以采用二分法哈希值来计算

首先将数组中的每个元素的个数计算出来

接下来通过二分法来一步步的算出 特征值的范围

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @param {number[]} nums
* @return {number}
*/
var specialArray = function(nums) {
const numHash = {}
for(let i = 0; i < nums.length; i++) {
if(!numHash[nums[i]]) {
numHash[nums[i]] = 0
}
numHash[nums[i]]++
}
let max = 1000, min = 0, half = (max + min) >> 1
while(max >= min) {
let total = Object.keys(numHash).reduce((total, item) => {
if(item >= half) {
total += numHash[item]
}
return total
} , 0)
if(total > half) {
min = half + 1
half = (max + min) >> 1
} else if(total < half) {
max = half - 1
half = (max + min) >> 1
} else {
return half
}
}
return - 1
};