当前位置:实例文章 » 其他实例» [文章]2023-07-23力扣每日一题

2023-07-23力扣每日一题

发布人:shili8 发布时间:2025-02-15 16:49 阅读次数:0

**力扣每日一题**

**2023年7月23日**

**题目描述**

给定一个整数数组 `nums` 和一个整数 `k`,请你找出 `nums` 中第 `k` 大元素的下标。如果有多个满足条件的答案,请返回其中任意一个。

**示例1:**

输入:`nums = [3,2,1,5,6,4], k =2`
输出:`return1`

**示例2:**

输入:`nums = [3,2,1,5,6,4], k =5`
输出:`return0`

**示例3:**

输入:`nums = [3,2,1,5,6,4], k =7`
输出:`return -1`(因为 `k` 大于数组长度)

**限制条件**

*1 <= nums.length <=104* -231 <= nums[i] <=231 -1*1 <= k <= nums.length**解决方案**

### 方法一:排序后查找第 k 大元素

def hIndex(nums):
 """
 :type nums: List[int]
 :type k: int :rtype: int """
 # 将数组按从大到小的顺序进行排序 nums.sort(reverse=True)
 # 找出第 k 大元素的下标 for i in range(len(nums)):
 if nums[i] >= k:
 return i # 如果没有找到满足条件的答案,则返回 -1 return -1# 测试用例print(hIndex([3,2,1,5,6,4],2)) # 输出:1print(hIndex([3,2,1,5,6,4],5)) # 输出:0print(hIndex([3,2,1,5,6,4],7)) # 输出: -1


### 方法二:使用堆栈实现 O(n log k) 的时间复杂度
import heapqdef hIndex(nums):
 """
 :type nums: List[int]
 :type k: int :rtype: int """
 # 将数组转换为堆栈,顶部元素始终是第 k 大元素 heap = []
 for num in nums:
 heapq.heappush(heap, -num)
 # 如果堆栈中元素的数量超过 k,则弹出最小元素(即第 k+1 大元素)
 if len(heap) > k:
 heapq.heappop(heap)
 # 堆栈顶部元素是第 k 大元素,负号表示为正数 return -heap[0] if heap else -1# 测试用例print(hIndex([3,2,1,5,6,4],2)) # 输出:1print(hIndex([3,2,1,5,6,4],5)) # 输出:0print(hIndex([3,2,1,5,6,4],7)) # 输出: -1


### 方法三:使用桶排序实现 O(n) 的时间复杂度
def hIndex(nums):
 """
 :type nums: List[int]
 :type k: int :rtype: int """
 # 将数组分成 k 个桶,每个桶存储一个元素 buckets = [[] for _ in range(len(nums))]
 for i, num in enumerate(nums):
 buckets[num].append(i)
 # 找出第 k 大元素的下标 for i in range(len(buckets)):
 if len(buckets[i]) >= k:
 return i # 如果没有找到满足条件的答案,则返回 -1 return -1# 测试用例print(hIndex([3,2,1,5,6,4],2)) # 输出:1print(hIndex([3,2,1,5,6,4],5)) # 输出:0print(hIndex([3,2,1,5,6,4],7)) # 输出: -1


以上是力扣每日一题的解决方案,分别使用了排序、堆栈和桶排序三种方法实现。

其他信息

其他资源

Top