Keshawn_lu's Blog

Leetcode 1608. 特殊数组的特征值

字数统计: 455阅读时长: 1 min
2022/09/12 Share

题目简介:

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

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

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

示例 1:

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

示例 2:

1
2
3
4
5
6
7
输入:nums = [0,0]
输出:-1
解释:没有满足题目要求的特殊数组,故而也不存在特征值 x 。
如果 x = 0,应该有 0 个元素 >= x,但实际有 2 个。
如果 x = 1,应该有 1 个元素 >= x,但实际有 0 个。
如果 x = 2,应该有 2 个元素 >= x,但实际有 0 个。
x 不能取更大的值,因为 nums 中只有两个元素。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

思路:

首先将数组进行升序排序,由于res的范围为[1, nums.size()],所以我们就依次遍历数组,将res初始化为nums.size()

若当前nums[i] < res,就说明少于res个元素大于等于res,此时就将res--

nums[i] >= res && nums[i - 1] < res,就说明满足了要求,返回res即可。

tip:

  • 若排序后nums[0] >= nums.size(),则直接返回nums.size()即可。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int specialArray(vector<int>& nums) {

sort(nums.begin(), nums.end());

if(nums[0] >= nums.size())
return nums.size();

int res = nums.size();
for(int i = 0; i < nums.size(); i++){

if(nums[i] < res)
res--;
else if(nums[i - 1] < res)
return res;
}

return -1;

}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: