满足目标工作时长的员工数目

标签: 数组

难度: Easy

公司里共有 n 名员工,按从 0n - 1 编号。每个员工 i 已经在公司工作了 hours[i] 小时。

公司要求每位员工工作 至少 target 小时。

给你一个下标从 0 开始、长度为 n 的非负整数数组 hours 和一个非负整数 target

请你用整数表示并返回工作至少 target 小时的员工数。

示例 1:

输入:hours = [0,1,2,3,4], target = 2
输出:3
解释:公司要求每位员工工作至少 2 小时。
- 员工 0 工作 0 小时,不满足要求。
- 员工 1 工作 1 小时,不满足要求。
- 员工 2 工作 2 小时,满足要求。
- 员工 3 工作 3 小时,满足要求。
- 员工 4 工作 4 小时,满足要求。
共有 3 位满足要求的员工。

示例 2:

输入:hours = [5,1,4,2,2], target = 6
输出:0
解释:公司要求每位员工工作至少 6 小时。
共有 0 位满足要求的员工。

提示:

  • 1 <= n == hours.length <= 50
  • 0 <= hours[i], target <= 105

Submission

运行时间: 20 ms

内存: 16.7 MB

class Solution:
    def numberOfEmployeesWhoMetTarget(self, hours: List[int], target: int) -> int:
        #hours.append(target)
        #hours.sort()
        #return len(hours)-hours.index(target)-1
        ans=0
        for i in hours:
            if i>=target:
                ans+=1
        return ans

Explain

题解采用直接遍历数组的方法,对每个员工的工作时长进行检查。算法通过一个计数器来统计所有满足工作时长大于等于target的员工数量。简单地,每次遇到满足条件的工作时长,计数器就增加1,最后返回这个计数器的值。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def numberOfEmployeesWhoMetTarget(self, hours: List[int], target: int) -> int:
        ans = 0  # 初始化计数器
        for i in hours:  # 遍历每个员工的工作时长
            if i >= target:  # 检查是否满足条件
                ans += 1  # 满足条件,计数器增加
        return ans  # 返回满足条件的员工总数

Explore

遍历整个hours数组是最直接的方法,时间复杂度为O(n),其中n是数组hours的长度。这种方法在所有情况下都是最优的,因为它保证了只遍历一次数组,且不需要额外的数据结构。使用排序或二分搜索等方法通常需要先对数组进行排序,其时间复杂度至少为O(n log n),这在本题中不是性能上的优化。因此,对于这个问题,直接遍历是最高效的解决方式。

在Python中,比较操作(如`i >= target`)是非常高效的,并且可以准确处理非常大或非常小的整数值。Python的整数是动态大小的,可以处理比标准整数类型更大或更小的值。因此,无论hours数组中的值有多大或多小,比较操作都可以正确执行,不会对性能或结果产生负面影响。

该算法在逻辑上可以处理包含负数的hours数组或负数的target。比较操作`i >= target`在数学上仍然有效,无论i或target的值是正是负。例如,如果target为负数,任何非负的工作时长都将满足条件,如果hours中的元素也为负数,只有当它们大于等于target时才会被计数。因此,算法在逻辑上无需修改即可处理这种情况。

如果hours数组长度为0,算法会正确地返回0,因为没有员工的工作时长可以检查。这种情况下算法已经具备了处理空数组的能力,因为计数器的初始值为0,并且在没有遍历任何元素的情况下直接返回。这保证了算法对于空数组输入的鲁棒性。