1608. 特殊数组的特征值 (一次遍历)

102 阅读1分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    lLCvOP7TAS.png

  • 题目解析

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 1000

二、思路分析:

我们拿到本题,读取题目内容要在给定的数组中,找到-个数x,且x数需要满足在nums中有x个元素大于或等于x,则就是nums是一个特殊数组,x是该数组的特征值。看到这个规则我们还是不好理解,根据题目给出的示列,找出以下规律:

流程图 (13).jpg

  • 特征值:x,取值范围在0~len(nums)之间
  • 当 nums 中存在 x 个元素大于等于 x,则返回特征值x
  • 当 nums 不存在 x值,则返回 -1

根据以上对题目中内容进行理解,本次我们可以使用如下三中方法进行求解:

  • 方式一:暴力求解

    • 我们只要在遍历nums长度范围内的x取值范围内进行取值i
    • 每取一个值i时,在nums中找到符合大于等于x的次数ans
    • 通过ans等于x时,则返回特殊值i
     class Solution(object):
         def specialArray(self, nums):
             """
             :type nums: List[int]
             :rtype: int
             """
             for i in range(len(nums)+1):
                 ans = 0
                 for num in nums:
                     if num >=i:
                         ans +=1
                 if ans == i :
                     return i
             return -1
    
  • 方法二:排序+一次遍历

    • 对于nums数组中,只要找出元素个数大于等于x的,为了减少重复查询的次数,我们可以先对数组nums进行排序(升序),长度n为len(nums)
    • 找出最小的元素nums[i] >= n-i时,则特征值就为n-i
    • 当 i 并且 nums[i-1] >= n -i 或者遍历完成n个数后都没有满足要求,则返回 -1
    class Solution(object):
        def specialArray(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            nums.sort()
            n = len(nums)
            for i in range(n):
                if i and nums[i-1] >= n - i : return -1
                if nums[i] >= n - i :
                    return n-i   
            return -1
    

三、总结:

本题考察对数组中元素进行遍历查找,当数组元素具有一定规律时,我们可以借助排序方法先对数组进行处理,然后在进行查找会提高代码处理效率,本次AC提交记录如下:

image.png

  • 时间复杂度:O(nlogn),n为nums的长度
  • 空间复杂度:O(logn),对 nums进行排序的栈空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~