首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >图解LeetCode——1608. 特殊数组的特征值(难度:简单)

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

作者头像
爪哇缪斯
发布2023-05-10 11:37:48
发布2023-05-10 11:37:48
2170
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

一、题目

给你一个非负整数数组 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;

四、代码实现

代码语言:javascript
复制
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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
  • 二、示例
    • 2.1> 示例 1:
    • 2.2> 示例 2:
    • 2.3> 示例 3:
    • 2.4> 示例 4:
    • 提示:
  • 三、解题思路
  • 四、代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档