zoukankan      html  css  js  c++  java
  • 第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;
        }
  • 相关阅读:
    判断页面访问端是电脑还是手机?
    Vue使用总结
    JS面向对象,创建,继承
    你不得不知的逻辑或(||)与(&&)非(!)
    前端必备PS技巧
    你真的熟悉background吗?
    JS运动从入门到兴奋1
    过目不忘JS正则表达式
    W3C、MDN及html常用标签介绍
    js数据处理-----数据拷贝
  • 原文地址:https://www.cnblogs.com/dynas/p/7011040.html
Copyright © 2011-2022 走看看