215. 數組中的第K個最大元素 BFPRT最牛解法

在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序后的第 k 個最大的元素,而不是第 k 個不同的元素。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
示例?2:

輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
說明:

你可以假設 k 總是有效的,且 1 ≤ k ≤ 數組的長度。

思路:堆、改進快排、BFPRT

解釋鏈接

public class Solution {/*
//前k小public static int[] getMinKNumsByBFPRT(int[] arr, int k) {if (k < 1 || k > arr.length) {return arr;}int minKth = findKthLargest(arr, k);int[] res = new int[k];int index = 0;for (int i = 0; i != arr.length; i++) {if (arr[i] < minKth) {res[index++] = arr[i];}}for (; index != res.length; index++) {res[index] = minKth;}return res;}*/
//第k小public static int findKthLargest(int[] arr, int K) {int[] copyArr = copyArray(arr);return select(copyArr, 0, copyArr.length - 1, arr.length-K);}public static int[] copyArray(int[] arr) {int[] res = new int[arr.length];for (int i = 0; i != res.length; i++) {res[i] = arr[i];}return res;}
//給定一個數組和范圍,求第i小的數public static int select(int[] arr, int begin, int end, int i) {if (begin == end) {return arr[begin];}int pivot = medianOfMedians(arr, begin, end);//劃分值int[] pivotRange = partition(arr, begin, end, pivot);if (i >= pivotRange[0] && i <= pivotRange[1]) {return arr[i];} else if (i < pivotRange[0]) {return select(arr, begin, pivotRange[0] - 1, i);} else {return select(arr, pivotRange[1] + 1, end, i);}}
//在begin end范圍內進行操作public static int medianOfMedians(int[] arr, int begin, int end) {int num = end - begin + 1;int offset = num % 5 == 0 ? 0 : 1;//最后一組的情況int[] mArr = new int[num / 5 + offset];//中位數組成的數組for (int i = 0; i < mArr.length; i++) {int beginI = begin + i * 5;int endI = beginI + 4;mArr[i] = getMedian(arr, beginI, Math.min(end, endI));}return select(mArr, 0, mArr.length - 1, mArr.length / 2);//只不過i等于長度一半,用來求中位數}
//經典partition過程public static int[] partition(int[] arr, int begin, int end, int pivotValue) {int small = begin - 1;int cur = begin;int big = end + 1;while (cur != big) {if (arr[cur] < pivotValue) {swap(arr, ++small, cur++);} else if (arr[cur] > pivotValue) {swap(arr, cur, --big);} else {cur++;}}int[] range = new int[2];range[0] = small + 1;range[1] = big - 1;return range;}
//五個數排序,返回中位數public static int getMedian(int[] arr, int begin, int end) {insertionSort(arr, begin, end);int sum = end + begin;int mid = (sum / 2) + (sum % 2);return arr[mid];}
//手寫排序public static void insertionSort(int[] arr, int begin, int end) {for (int i = begin + 1; i != end + 1; i++) {for (int j = i; j != begin; j--) {if (arr[j - 1] > arr[j]) {swap(arr, j - 1, j);} else {break;}}}}
//交換值public static void swap(int[] arr, int index1, int index2) {int tmp = arr[index1];arr[index1] = arr[index2];arr[index2] = tmp;}/*
//打印public static void printArray(int[] arr) {for (int i = 0; i != arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}*/
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444520.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++: 06---構造函數析構函數

拷貝構造函數: 用一個已經存在的對象來生成一個相同類型的新對象。(淺拷貝)默認的拷貝構造函數: 如果自定義了拷貝構造函數,編譯器就不在生成默認的拷貝構造函數。 如果沒有自定義拷貝構造函數,但在代碼中用到了拷貝構造函數,編譯器會生成默認…

leetcode371. 兩整數之和 不用+號做加法

不使用運算符 和 - &#xff0c;計算兩整數 ???????a 、b ???????之和。 示例 1: 輸入: a 1, b 2 輸出: 3 示例 2: 輸入: a -2, b 3 輸出: 1 思路&#xff1a;模擬加法器 二進制不考慮進位&#xff1a;000&#xff0c;010&#xff0c;110&#xff0c;是…

C++:05---class和struct

C++被稱為“C with class”,可見在C++中class是多么重要,與class類似的一個結構就是struct了,struct最早是在C語言中出現的,在C++中對struct的功能也進行了擴展。 class : public(公有):在類內外、派生類中都可被訪問protected(保護):希望與派生類共享但是不想被公共…

leetcode34. 在排序數組中查找元素的第一個和最后一個位置

給定一個按照升序排列的整數數組 nums&#xff0c;和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。 你的算法時間復雜度必須是 O(log n) 級別。 如果數組中不存在目標值&#xff0c;返回 [-1, -1]。 示例 1: 輸入: nums [5,7,7,8,8,10], target 8 輸…

C++:11---友元函數、友元類

一、友元(friend) 概念:通過友元,打破了類的封裝性,可以訪問類內的所有成員分類:友元函數、友元類二、友元函數 概念:友元函數是一個普通函數,不屬于類,但需要在類內表明友元關系 友元函數可訪問類內所有成員,但類不可以訪問友元函數…

leetcode75. 顏色分類

給定一個包含紅色、白色和藍色&#xff0c;一共 n 個元素的數組&#xff0c;原地對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排列。 此題中&#xff0c;我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 注意: 不能使用代碼…

C++:12---運算符重載

一、概念 對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數據類型重載的運算符是具有特殊名字的函數,該函數也有返回值、參數列表、函數體二、運算符重載的3種實現方式 成員函數:私有、公有、保護都可以友元函數:同上全局函數:只能訪問公有的三、運算符重載的…

Redis:03---Redis的啟動與配置參數大全

一、Redis的可執行文件當我們安裝完Redis之后&#xff0c;src和/usr/local/bin目錄下提供了下面這些可執行程序&#xff0c;我們稱之為Redis Shell&#xff1a;redis-serverRedis服務器redis-cliRedis命令行客戶端redis-benchmarkRedis性能測試工具redis-check-aofRedis AOF持久…

leetcode80. 刪除排序數組中的重復項 II

給定一個排序數組&#xff0c;你需要在原地刪除重復出現的元素&#xff0c;使得每個元素最多出現兩次&#xff0c;返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。 示例 1: 給定 nums [1,1,1,2…

Redis:04---鍵的基本命令(上)

一、KEYS&#xff1a;全量遍歷鍵KEYS pattern功能&#xff1a;用來獲取此數據庫中所有的鍵名注意事項&#xff1a;KEYS命令需要遍歷Redis中的所有鍵&#xff0c;當鍵的數量較多時會影響性能&#xff0c;不建議在生產環境下使用支持glob風格通配符格式&#xff0c;見下表&#x…

leetcode67. 二進制求和

給定兩個二進制字符串&#xff0c;返回他們的和&#xff08;用二進制表示&#xff09;。 輸入為非空字符串且只包含數字 1 和 0。 示例 1: 輸入: a "11", b "1" 輸出: "100" 示例 2: 輸入: a "1010", b "1011" 輸出…

C++:13---繼承(單一繼承、多重繼承、多級繼承、菱形繼承、虛繼承)

一、基類與派生類的概念 基類(父類):在繼承關系中處于上層的類派生類(子類):在繼承關系中處于下層的類class A;class B;class C:public A //C為A的子類,A為C的父類{};class D:public A,public B //D為A和B的子類,A和B均為D的父類{};二、類派生列表 派生類通過派生類列…

(十三) 深入淺出TCPIP之setsockopt參數詳解

在socket編程中我們會經常用到setsockopt這個函數&#xff0c;那么本節我們將對這個函數的參數和使用做說明&#xff1a; 首先看下函數原型&#xff1a; int setsockopt( int socket, int level, int option_name,const void *option_value, size_t &#xff0c;ption_len); 第…

22種編程語言新年快樂

請允許我用22種編程語言&#xff0c;祝大家新年快樂 C語言&#xff1a;printf(“祝大家新年快樂”); C : cout<<“祝大家新年快樂”; OC: NSLog(“祝大家新年快樂”) QBasic : Print “祝大家新年快樂” Asp : Response.Write “祝大家新年快樂” PHP : echo “祝大家新年…

Redis:05---鍵的基本命令(下) 生存周期

一、設置鍵生存/過期時間生存時間&#xff08;Time To Live&#xff0c;TTL&#xff09;&#xff1a;在經過指定的秒數或者毫秒數之后&#xff0c;服務器就會自動刪除生存時間為0的鍵過期時間&#xff08;expire time&#xff09;&#xff1a;是一個UNIX時間戳&#xff0c;當鍵…

數論基礎代碼合集

歐幾里德 #include<iostream> using namespace std; int hcf(int a,int b) {int r0;while(b!0){ra%b;ab;br;}return(a); } lcd(int u,int v,int h) //ua&#xff0c;vb&#xff0c;h為最小公約數hcf(a,b); {return(u*v/h); } int main() {int a,b,x,y;cin>>…

C++:03---引用類型

一、概念 C++中的一種新的變量類型,作用是為變量取別名二、引用規則 引用被創建時必須被初始化(即必須指向一個對象,因此引用一旦被初始化,就不能再指向其他對象)int a = 10; int &p = a; //正確 int &p2; //錯誤,引用必須初始化引用的數據類型必須與被引用的…

三個博弈基礎

&#xff08;一&#xff09;巴什博奕&#xff08;Bash Game&#xff09;&#xff1a;只有一堆n個物品&#xff0c;兩個人輪流從這堆物品中取物&#xff0c;規定每次至少取一個&#xff0c;最多取m個。最后取光者得勝。 顯然&#xff0c;如果nm1&#xff0c;那么由于一次最…

(十五)nodejs循序漸進-高性能游戲服務器框架pomelo之Protobuf模塊

消息壓縮 在實際編程中&#xff0c;為了減少數據傳輸帶寬的消耗&#xff0c;提高傳輸效率&#xff0c;pomelo提供了對消息的壓縮&#xff0c;包括基于字典的對route的壓縮和基于protobuf的對具體傳輸數據的壓縮。 route壓縮 在實際編程中&#xff0c;網絡帶寬的有效數據負載…

C++:13---多態和虛函數表

多態的意思為“以一個public基類的指針/引用,尋址一個派生類對象”。 “多態”的關鍵在于通過基類指針或引用調用一個虛函數時,編譯時不確定到底調用的是基類還是派生類的函數,運行時才確定。這是如何實現的呢?請看下面的程序,該程序演示了多態類對象存儲空間的大小。 #in…