📜  删除给定元素后找到k个最小的数字(1)

📅  最后修改于: 2023-12-03 15:07:16.082000             🧑  作者: Mango

题目描述

给定一个整数数组nums和一个整数k,移除数组中所有值为val的元素,并返回数组中第k小的元素。如果数组中不足k个元素,则返回数组中所有元素。

解题思路

本题可以使用快排思想,对数组进行快排后,再遍历数组找到第k小的元素。需要注意的是,由于题目要求删除某个元素,可以使用快慢指针,快指针扫描整个数组,当遇到val元素时,慢指针停止移动,快指针继续向后扫描;当快指针指向非val元素时,将该元素复制到慢指针位置,然后慢指针向后移动一位。

代码实现(Python)

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),因为在原数组上进行排序和删除操作,没有额外的空间开销。