给你一个非负整数数组 nums
。如果存在一个数 x
,使得 nums
中恰好有 x
个元素 大于或者等于 x
,那么就称 nums
是一个 特殊数组 ,而 x
是该数组的 特征值 。
注意: x
不必 是 nums
的中的元素。
如果数组 nums
是一个 特殊数组 ,请返回它的特征值 x
。否则,返回 -1
。可以证明的是,如果 nums
是特殊数组,那么其特征值 x
是 唯一的 。
【输入】nums = [3,5]
【输出】2
【解释】有 2 个元素(3 和 5)大于或等于 2 。
【输入】nums = [0,0]
【输出】-1
【解释】没有满足题目要求的特殊数组,故而也不存在特征值 x 。
如果 x = 0,应该有 0 个元素 >= x,但实际有 2 个。
如果 x = 1,应该有 1 个元素 >= x,但实际有 0 个。
如果 x = 2,应该有 2 个元素 >= x,但实际有 0 个。
x 不能取更大的值,因为 nums 中只有两个元素。
【输入】nums = [0,4,3,0,4]
【输出】3
【解释】有 3 个元素大于或等于 3 。
【输入】nums = [3,6,7,7,0]
【输出】-1
1
<= nums.length <= 100
0
<= nums[i] <= 1000
根据题目描述,x
的取值范围应该是[1, nums.length]
,那么为了便于判断比对,我们首先需要将nums进行升序排序。然后,根据下图的例子,我们可以得出如下结论:
当x等于 nums.length 时,需要满足
nums[0] >= nums.length
;
当x等于 [1, nums.length - 1] 时,需要满足nums[i] >= (res = nums.length - i)
并且nums[i - 1] < res
;
那么,题目中描述到:“可以证明的是,如果 nums 是特殊数组,那么其特征值x是唯一的”,为什么呢?我们再来把视线移动到上方图片上,我们假设x不是唯一的,即:假设x==6并且x==5。那么当x等于6的时候,我们需要满足nums[1]>=6
;当x等于5的时候,我们需要满足nums[1] < 5
; 那么针对nums[1]是无法满足即大于等于6又小于5的。所以,只要nums是特殊数组,特征值x就是唯一的。
由于特征值x是唯一的,所以,只要有x满足了上面的判断条件,就将x值返回即可。如果没有符合的x,则返回-1;
- class Solution {
- public int specialArray(int[] nums) {
- Arrays.sort(nums);
- if (nums[0] >= nums.length) return nums.length;
- for (int i = 1, res = 0; i < nums.length; i++)
- if (nums[i] >= (res = nums.length - i) && nums[i - 1] < res) return res;
- return -1;
- }
- }
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」