LeetCode每日一题——1608. 特殊数组的特征值

简介: 给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

题目

示例

给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

注意: x 不必 是 nums 的中的元素。

如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 。

思路

1.先对原数组升序排序

2.遍历每一个元素,看剩下元素的个数是否在(tmp, 当前元素] 之间,若在,直接返回剩下元素的个数,若不在,继续遍历。

3.这里的tmp是要动态变化的,初始值应设为0,后面遍历到无法作为答案返回的元素,就把tmp的值改为该元素的值作为判断区间的首元素。(这里的原理是前面遍历过的元素既然没有作为答案返回就证明后面剩下元素的个数一定比该元素值大,如果我们再从0开始判断,一定会包含前面某个元素,这时,就会出现误判, 如[3,6,7,7,0],排完序是[0,3,6,7,7], 会发现遍历到3时后方元素还有4个不符合要求不返回,往后是6,如果我们判断区间为(0,6]那么剩下元素为3个在区间内,就会当做答案返回了)

题解

class Solution:
    def specialArray(self, nums: List[int]) -> int:
        nums = sorted(nums)
        n = len(nums)
        tmp = 0
        for i in range(n):
            # 判断区间
            if n - i in range(tmp+1, nums[i]+1):
                return n - i
            # 更新边界值
            tmp = nums[i]
        return -1
目录
相关文章
|
19天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
12天前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
12天前
|
算法 C语言
Leetcode----旋转数组 ------C语言篇
Leetcode----旋转数组 ------C语言篇
|
7天前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
13 0
|
9天前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
17 1
|
11天前
|
存储 算法
【数据结构与算法 | 基础篇】[数组专题]力扣88
【数据结构与算法 | 基础篇】[数组专题]力扣88
|
12天前
力扣2834. 找出美丽数组的最小和
力扣2834. 找出美丽数组的最小和
|
13天前
力扣421. 数组中两个数的最大异或值(字典树)
力扣421. 数组中两个数的最大异或值(字典树)
|
19天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
16 2
|
19天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
15 0