📅  最后修改于: 2023-12-03 15:07:16.082000             🧑  作者: Mango
给定一个整数数组nums和一个整数k,移除数组中所有值为val的元素,并返回数组中第k小的元素。如果数组中不足k个元素,则返回数组中所有元素。
本题可以使用快排思想,对数组进行快排后,再遍历数组找到第k小的元素。需要注意的是,由于题目要求删除某个元素,可以使用快慢指针,快指针扫描整个数组,当遇到val元素时,慢指针停止移动,快指针继续向后扫描;当快指针指向非val元素时,将该元素复制到慢指针位置,然后慢指针向后移动一位。
def find_kth_smallest_element(nums, val, k):
if not nums:
return []
# 快慢指针删除元素
slow = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
# 快排
def quick_sort(left, right):
if left >= right:
return
pivot = nums[left]
i, j = left, right
while i < j:
while i < j and nums[j] >= pivot:
j -= 1
nums[i] = nums[j]
while i < j and nums[i] <= pivot:
i += 1
nums[j] = nums[i]
nums[i] = pivot
quick_sort(left, i-1)
quick_sort(i+1, right)
quick_sort(0, slow-1)
# 找到第k小的元素
if k > len(nums):
return nums
else:
return nums[:k]
本题中,快慢指针删除元素和快排的时间复杂度均为O(nlogn),所以总的时间复杂度为O(nlogn)。空间复杂度为O(1),因为在原数组上进行排序和删除操作,没有额外的空间开销。