https://leetcode-cn.com/problems/smallest-k-lcci/
一开始想的是遍历整个arr数组,遍历的同时用二叉搜索树去存储和修改输出结果,遍历完了之后把该二叉树还原为数组。后来放弃了,用了下面的这个方法,新建一个result数组,对arr数组进行快速排序,排序的同时把已经排好序的而且下标小于k的元素存到result数组当中,最后返回result数组,如果有优化的思路或者更好的方案希望各路大神不吝赐教。
执行结果:
代码:
public class Solution {
public int[] SmallestK(int[] arr, int k) {
if(arr == null || arr.Length <= 0)
return new int[0];
int[] result = new int[k];
Sort(arr, 0 ,arr.Length-1, result, k);
return result;
}
/// <summary>
/// 排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="low">下标开始位置,向右查找</param>
/// <param name="high">下标开始位置,向左查找</param>
public static void Sort(int[] array, int low, int high,int[] result, int k)
{
if (low >= high)
{
if(low < k)
{
result[low] = array[low];
}
return;
}
//完成一次单元排序
int index = SortUnit(array, low, high, result, k);
//递归调用,对左边部分的数组进行单元排序
Sort(array, low, index - 1, result, k);
//递归调用,对右边部分的数组进行单元排序
Sort(array, index + 1, high, result, k);
}
/// <summary>
/// 单元排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="low">下标开始位置,向右查找</param>
/// <param name="high">下标开始位置,向右查找</param>
/// <returns>每次单元排序的停止下标</returns>
public static int SortUnit(int[] array, int low, int high, int[] result, int k)
{
int key = array[low];//基准数
while (low < high)
{
//从high往前找小于或等于key的值
while (low < high && array[high] > key)
high--;
//比key小开等的放左边
array[low] = array[high];
//从low往后找大于key的值
while (low < high && array[low] <= key)
low++;
//比key大的放右边
array[high] = array[low];
}
//结束循环时,此时low等于high,左边都小于或等于key,右边都大于key。将key放在游标当前位置。
array[low] = key;
if(low < k)
{
result[low] = key;
}
return high;
}
}