1608. 特殊数组的特征值
一、问题描述
二、算法思想
题中的x要自己找出,因为要使得 nums 中恰好有 x 个元素 大于或者等于 x,所以0 <= x <= length。因为本人水平有限,length这种情况要做特殊判断。题中没对nums的元素顺序提出要求,因此可以先对其进行排序来方便比较操作。用sum来记录满足条件的特征值个数,初值为0;用k来记录特征值,初值为-1,for循环后返回k,若是没找到k就是-1,符合题意
1、对nums排序后比较nums[0]和length的大小,若length小于nums[0],则返回length,否则继续进行判断。
2、利用for循环从1到length-1进行判断。直接从下标为nums[length - x - 1]开始判断,若x比nums[length - x - 1]小,说明比x大的元素超过了x个,继续判断下一个数;
3、判断x与nums[length - x]的大小,若x大,继续判断下一个;否则判断sum是否为一,为一说明之前有一个数满足了,因为特征值只有一个,所以返回-1,不为1令sum的值加一。
4、返回k
三、代码
class Solution(object):
def specialArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums)
sum = 0
nums = sorted(nums)
x = 0
k = -1
if length <= nums[0]:
return length
else:
for x in range(1,length):
if x > nums[length - x - 1]:
if x <= nums[length - x]:
if sum == 1:
return -1
else:
sum += 1
k = x
return k
四、题目链接
https://leetcode.cn/problems/special-array-with-x-elements-greater-than-or-equal-x/