• 第k大的元素


    在数组中找到第k大的元素

     注意事项

    你可以交换数组中的元素的位置

    样例

    给出数组 [9,3,2,4,8],第三大的元素是 4

    给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

    堆排序:

    建立大小为k的小顶堆,输出nums[0]

    void makeHeap(vector<int> &nums,int k,int n)
         {
             int i = k;
             int j = 2 * i + 1;
             int temp = nums[i];
             while(j < n)
             {
                 if(j < n - 1 && nums[j] > nums[j + 1])j++;
    
                 if(temp < nums[j])break;
                 else
                 {
                     nums[i] = nums[j];
                     i = j;
                     j = 2 * j + 1;
                 }
             }
             nums[i] = temp;
         }
         void initHeap(vector<int> &nums,int n)
         {
             for(int i = (n - 2) / 2;i >= 0;i--)
             {
                 makeHeap(nums,i,n);
             }
         }
         
        int kthLargestElement(int k, vector<int> nums) {
            // write your code here
            int n = nums.size();
            if(k > n)return -1;
            initHeap(nums,k);
            for(int i = k;i < n;i++)
            {
                if(nums[i] > nums[0])
                {
                    int tmp = nums[i];
                    nums[i] = nums[0];
                    nums[0] = tmp;
                    makeHeap(nums,0,k);
                }
            }
            return nums[0];
        }

    快排:

    从大到小排列,输出nums[k - 1]

    int parition(vector<int> &nums,int low,int high)
      {
        int i = low;
        int j = high;
        int temp = nums[i];
        while(i < j)
        {
            while(i < j && nums[j] <= temp)j--;
            if(i < j )
            {
               nums[i++] = nums[j];
            }
            while(i < j && nums[i] > temp)i++;
            if(i < j)
            {
                nums[j--] = nums[i];
            }
        }
        nums[i] = temp;
        return i;
      }
      int kthLargestElement(int k, vector<int> nums) {
            // write your code here
            int n = nums.size();
            if(k > n)return -1;
            int i = 0;
            int j = n -1;
            while(1)
            {
                int qqq = parition(nums,i,j);
                if(qqq == k - 1)return nums[k - 1];
                else if(qqq < k -1)
                {
                    i = qqq + 1;
    
                }
                else j = qqq - 1;
    
            }
            return -1;
        }
  • 相关阅读:
    python标准库
    python常用标准库
    django-restframework-serializers
    Resources.UnloadUnusedAssets
    Shader 的 Blend
    C++STL queue
    C++STL stack
    C++STL deque
    C++STL容器重点
    C++STL 迭代器
  • 原文地址:https://www.cnblogs.com/dynas/p/7011040.html
Copyright © 2020-2023  润新知