1. 题目
2. 解法
2.1 解法一 (升序排列)
- 时间复杂度
- 空间复杂度
- 代码
class Solution {
public:
int specialArray(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 将元素按照从小到大进行排序
int last_elem = 0; // j从0开始累加尝试
for (int i=0; i<nums.size(); ++i) { // 数组中的每个元素对j而言都是一个认证点
int remain_num = nums.size() - i;
for(int j=last_elem; j<=nums[i]; ++j) { // j从last_elem开始进行累加
if (remain_num < j) { // 剩余元素个数小于j, 说明找不到符合题意的x值
return -1;
}
else if (remain_num == j) { // 剩余元素个数等于j, 当前的j值即为题目要求的值
return j;
}
}
last_elem = nums[i] + 1; // j一直尝试到nums[i], 都没有找到符合条件的x,所以,下一轮从新的值nums[i]+1开始
}
return -1;
}
};
2.2 解法二(降序排列)
- 时间复杂度
- 空间复杂度
- 代码
class Solution {
public:
int specialArray(vector<int>& nums) {
sort(nums.begin(), nums.end(), greater<int>()); // 降序排列
int n = nums.size();
for (int i = 1; i <= n; ++i) { // 特征值一定在1~n之间,只需要遍历0~1
if (nums[i - 1] >= i && (i == n || nums[i] < i)) { // i值一定满足在nums[i-1]到nums[i]之间, 由于是降序排列,所以nums[i-1]值更大
return i;
}
}
return -1;
}
};