题目地址:
https://leetcode.com/problems/special-array-with-x-elements-greater-than-or-equal-x/
给定一个长 n n n的非负整数数组 A A A,问是否存在某个数 x x x,使得 A A A中大于等于 x x x的数恰好是 x x x个。题目保证 0 ≤ A [ i ] ≤ 1000 0\le A[i]\le 1000 0≤A[i]≤1000。
思路是计数排序。先数一下 A A A里每个数的出现次数,然后遍历值域,依次枚举值域里的每个数是否满足要求即可。代码如下:
public class Solution {
public int specialArray(int[] nums) {
int[] cnt = new int[1001];
for (int x : nums) {
cnt[x]++;
}
int c = 0;
for (int i = 0; i <= 1000; i++) {
// 大于等于i的数的个数是nums.length - c,c存的是小于i的数的个数
if (nums.length - c == i) {
return i;
}
c += cnt[i];
}
return -1;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。