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: # 将数组转换为