杭电数据结构

杭电数据结构考研历年代码题系列 1

主要记录一些感觉还不错的算法
遂开此系列,祝能考上

在此吐槽淘宝杭电考研专家这家店的代码题答案就没几道对的,真是醉了

19年真题,
数组中找k大元素
挺经典的一道题,最先能想到的就是现排序再直接下表返回倒数第k个,时间复杂度最快 nlnn(快排),但答案要求最好 n时间复杂度,可考虑1.快排思想。 2. 堆排序

1.快排思想改进

int Sort(int a[],int low, int high)
{
    int key = a[low];
    while(low< high)
    {
        while(low< high&& a[high]>= key) high--;
        a[low] = a[high];
        while(low< high&& a[low]< key) low++;
        a[high] = a[low]; 
    }
    a[low] = key;
    return low;
}

int findKthLargest(int* nums, int numsSize, int k){
    int low = 0, high = numsSize-1;
    k = numsSize- k + 1; 
    while(true)
    {
        int pivot = Sort(nums, low, high);
        if(pivot+1 == k)
            return nums[pivot];
        if((pivot+1)> k)
            high = pivot-1;
        if((pivot+1)< k)
            low = pivot+1;
    }
}

2.堆排序
这个思想其实很简单,就是先建一个大根堆,然后堆顶与最后元素交换k次(其实就是对排序,只是不用全部排,只拍前k过就好了),那么堆顶元素就是要找的元素了

你可能感兴趣的:(笔记,算法,数据结构,c++)