一、题目
给你一个非负整数数组?nums ?。如果存在一个数?x ?,使得?nums ?中恰好有?x ?个元素?大于或者等于?x ?,那么就称?nums ?是一个?特殊数组?,而?x ?是该数组的?特征值?。
注意:?x ?不必?是?nums ?的中的元素。
如果数组?nums ?是一个?特殊数组?,请返回它的特征值?x ?。否则,返回?-1 ?。可以证明的是,如果?nums ?是特殊数组,那么其特征值?x ?是?唯一的?。
二、示例
2.1> 示例 1:
【输入】nums = [3,5] 【输出】2 【解释】有 2 个元素(3 和 5)大于或等于 2 。
2.2> 示例 2:
【输入】nums = [0,0] 【输出】-1 【解释】没有满足题目要求的特殊数组,故而也不存在特征值 x 。 如果 x = 0,应该有 0 个元素 >= x,但实际有 2 个。 如果 x = 1,应该有 1 个元素 >= x,但实际有 0 个。 如果 x = 2,应该有 2 个元素 >= x,但实际有 0 个。 x 不能取更大的值,因为 nums 中只有两个元素。
2.3> 示例 3:
【输入】nums = [0,4,3,0,4] 【输出】3 【解释】有 3 个元素大于或等于 3 。
2.4> 示例 4:
【输入】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^)/ ~ 「干货分享,每天更新」
|