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

2023-07-16力扣每日一题

发布人:shili8 发布时间:2024-12-29 01:59 阅读次数:0

**力扣每日一题**

**题目描述**

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

**示例1**

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

输出:`2`

解释:数组中第二大的数字是 `5`,它出现在下标 `4` 处。

**示例2**

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

输出:`5`

解释:数组中第五大的数字是 `4`,它出现在下标 `3` 处。

**示例3**

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

输出:`-1`

解释:由于不存在第零大的数字,因此返回 `-1`。

**限制条件**

* `1 <= nums.length <=104`
* `-109 <= nums[i] <=109`
* `k` 的值为非负整数**解决方案**

### 方法一:排序后查找下标

class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化计数器和下标指针 count =0 idx =0 # 遍历集合中的数字 while idx < len(num_set):
 # 如果当前数字大于或等于 k,则返回下标 if num_set[idx] >= k:
 return idx # 否则,继续计数和移动指针 count +=1 idx +=1 # 如果遍历完成仍未找到答案,则返回 -1 return -1


### 方法二:使用二分查找
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化左、右指针和答案 left, right =0, len(num_set)
 ans = -1 # 使用二分查找找到第 k 大元素的下标 while left < right:
 mid = (left + right) //2 # 如果当前数字小于或等于 k,则移动右指针 if num_set[mid] <= k:
 ans = mid left = mid +1 # 否则,移动左指针 else:
 right = mid # 返回答案 return ans


### 方法三:使用堆栈
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化堆栈和答案 stack = []
 ans = -1 # 遍历集合中的数字 for num in num_set:
 # 如果当前数字小于或等于 k,则将其压入堆栈 if num <= k:
 stack.append(num)
 # 否则,继续遍历 else:
 continue # 如果堆栈中有元素,则返回下标 if stack:
 ans = stack.index(k) +1 # 返回答案 return ans


### 方法四:使用计数器
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化计数器和答案 count =0 ans = -1 # 遍历集合中的数字 for num in num_set:
 # 如果当前数字小于或等于 k,则将其添加到计数器中 if num <= k:
 count +=1 # 否则,继续遍历 else:
 continue # 如果计数器中的元素数量等于 k,则返回下标 if count == k:
 ans = num_set.index(k) +1 # 返回答案 return ans


### 方法五:使用二分查找和计数器
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化左、右指针、计数器和答案 left, right =0, len(num_set)
 count =0 ans = -1 # 使用二分查找找到第 k 大元素的下标 while left < right:
 mid = (left + right) //2 # 如果当前数字小于或等于 k,则移动右指针并更新计数器 if num_set[mid] <= k:
 count +=1 left = mid +1 # 否则,移动左指针 else:
 right = mid # 如果计数器中的元素数量等于 k,则返回下标 if count == k:
 ans = num_set.index(k) +1 # 返回答案 return ans


### 方法六:使用堆栈和计数器
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化堆栈、计数器和答案 stack = []
 count =0 ans = -1 # 遍历集合中的数字 for num in num_set:
 # 如果当前数字小于或等于 k,则将其压入堆栈并更新计数器 if num <= k:
 stack.append(num)
 count +=1 # 否则,继续遍历 else:
 continue # 如果堆栈中有元素且计数器中的元素数量等于 k,则返回下标 if stack and count == k:
 ans = stack.index(k) +1 # 返回答案 return ans


### 方法七:使用二分查找和堆栈
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化左、右指针、堆栈和答案 left, right =0, len(num_set)
 stack = []
 ans = -1 # 使用二分查找找到第 k 大元素的下标 while left < right:
 mid = (left + right) //2 # 如果当前数字小于或等于 k,则移动右指针并将其压入堆栈 if num_set[mid] <= k:
 stack.append(num_set[mid])
 left = mid +1 # 否则,移动左指针 else:
 right = mid # 如果堆栈中有元素且第一个元素等于 k,则返回下标 if stack and stack[0] == k:
 ans = stack.index(k) +1 # 返回答案 return ans


### 方法八:使用计数器和堆栈
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为集合,去重并排序 num_set = sorted(set(nums))
 # 初始化计数器、堆栈和答案 count =0 stack = []
 ans = -1 # 遍历集合中的数字 for num in num_set:
 # 如果当前数字小于或等于 k,则将其压入堆栈并更新计数器 if num <= k:
 stack.append(num)
 count +=1 # 否则,继续遍历 else:
 continue # 如果堆栈中有元素且计数器中的元素数量等于 k,则返回下标 if stack and count == k:
 ans = stack.index(k) +1 # 返回答案 return ans


### 方法九:使用二分查找和计数器
class Solution:
 def findKthPositive(self, nums: List[int], k: int) -> int:
 # 将数组转换为

其他信息

其他资源

Top