图解LeetCode——1608. 特殊数组的特征值(难度:简单)

一、题目

给你一个非负整数数组 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^)/ ~ 「干货分享,每天更新」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值