一、知识点:

快速选择

二、文字分析:

为了找出数组中第k小的元素,可以使用快速选择算法(QuickSelect)。

快速选择算法是快速排序算法的变种,但不需要完全排序整个数组。它通过选择一个基准元素(通常是数组的第一个元素),将数组划分为左边比基准元素小的子数组和右边比基准元素大的子数组。然后根据基准元素在数组中的位置,判断需要在左子数组还是右子数组中继续查找。

具体步骤如下:

  1. 选择一个基准元素,将数组划分为左右两个子数组。
  2. 根据基准元素的位置,如果k小于基准元素的位置,则在左子数组中继续查找第k小的元素。
  3. 如果k等于基准元素的位置,则返回基准元素。
  4. 如果k大于基准元素的位置,则在右子数组中继续查找第k-small的元素。
  5. 重复步骤1-4,直到找到第k小的元素。

这个算法的时间复杂度是O(n)

空间复杂度是O(log n)。

三、编程语言:

java

四、正确代码:

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param weights int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int findKthSmallest (int[] weights, int k) {
        if (weights == null || weights.length == 0 || k <= 0 || k > weights.length) {
            return -1;
        }
        return quickSelect(weights, 0, weights.length - 1, k - 1);
    }

    private int quickSelect(int[] weights, int left, int right, int k) {
        if (left == right) {
            return weights[left];
        }
        int pivotIndex = partition(weights, left, right);
        if (k == pivotIndex) {
            return weights[k];
        } else if (k < pivotIndex) {
            return quickSelect(weights, left, pivotIndex - 1, k);
        } else {
            return quickSelect(weights, pivotIndex + 1, right, k);
        }
    }

    private int partition(int[] weights, int left, int right) {
        int pivot = weights[left];
        int i = left + 1;
        int j = right;
        while (true) {
            while (i <= j && weights[i] < pivot) {
                i++;
            }
            while (i <= j && weights[j] > pivot) {
                j--;
            }
            if (i > j) {
                break;
            }
            swap(weights, i, j);
            i++;
            j--;
        }
        swap(weights, left, j);
        return j;
    }

    private void swap(int[] weights, int i, int j) {
        int temp = weights[i];
        weights[i] = weights[j];
        weights[j] = temp;
    }
}