自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

經(jīng)典算法:無序數(shù)組尋找第K大的數(shù)值

開發(fā) 前端 算法
有一個(gè)無序整數(shù)數(shù)組,請(qǐng)你根據(jù)排序思路,找出數(shù)組中第K大的數(shù)。給定一個(gè)整數(shù)數(shù)組a, 請(qǐng)返回第K (1<=K<=n) 大的數(shù)(包括重復(fù)的元素,不用去重),保證答案存在。

[[409182]]

1. 尋找第K大

題意

有一個(gè)無序整數(shù)數(shù)組,請(qǐng)你根據(jù)排序思路,找出數(shù)組中第K大的數(shù)。

給定一個(gè)整數(shù)數(shù)組a, 請(qǐng)返回第K (1<=K<=n) 大的數(shù)(包括重復(fù)的元素,不用去重),保證答案存在。

示例

  1. 輸入 [3,2,1,5,6,4] , 2 
  2. 返回值 5 

2. 常規(guī)思路

先對(duì)無序數(shù)組進(jìn)行排序,然后對(duì)有序數(shù)組進(jìn)行查找。

至于選擇什么排序算法,有待確定。

先看一下,各種排序算法的復(fù)雜度以及穩(wěn)定性。

看完上面比較之后,可能你心中已經(jīng)有了自己的答案。

3. 解題思路

常規(guī)思路需要兩大步:

  1. 先整體排序
  2. 在有序中查找目標(biāo)值

那么,針對(duì)這道題,我們能不能在排序的過程中就確定目標(biāo)值呢?

思考一下快排的二分特性:

  1. 先找出一個(gè)數(shù)值的位置,該數(shù)值的左側(cè)比自己小,右側(cè)比自己大(整個(gè)數(shù)組一分為二)
  2. 再分別進(jìn)行左、右兩部分進(jìn)行步驟1的操作,直至整個(gè)數(shù)組有序。

這里需要知道的是,在快排中某個(gè)數(shù)值左側(cè)比自己小,右側(cè)比自己大。該數(shù)值的位置就是在最終有序數(shù)組中的位置,也就是說可以在查找中確定目標(biāo)位置。并且,在本題的處理過程中,平均情況下只處理1/2的數(shù)據(jù)量。

經(jīng)典算法:無序數(shù)組尋找第K大的數(shù)值

動(dòng)圖 - 快排算法

快排算法查找過程:

4. Go代碼實(shí)現(xiàn)

  1. func findKLargest(arr []int, k intint { 
  2.     iflen(arr) == 0 || k > len(arr) { 
  3.         return-1 
  4.     } 
  5.  
  6.     var find func(k int, l, r intint 
  7.     find = func(k int, l, r intint { 
  8.         /* 
  9.         // 對(duì)于正常的快排,需要下面的代碼 
  10.         if l >= r { 
  11.             return 
  12.         } 
  13.         // 然而這里不需要,在尋找第k大的數(shù)據(jù)時(shí) 一般是 l==r 
  14.         */ 
  15.         ll := l 
  16.         rr := r 
  17.         target := arr[l] 
  18.  
  19.         // 倒序(第K大使用)排列 是 target >= arr[r]  / target <= arr[l] 
  20.         // 正序(第k小使用)排列 是 target <= arr[r]  / target >= arr[l] 
  21.         for l < r { 
  22.             for l < r && target >= arr[r] { 
  23.                 r-- 
  24.             } 
  25.             arr[l] = arr[r] 
  26.  
  27.             for l < r && target <= arr[l] { 
  28.                 l++ 
  29.             } 
  30.             arr[r] = arr[l] 
  31.         } 
  32.        
  33.         arr[l] = target 
  34.         // k在l的右側(cè) 
  35.         // 為什么 下面無論是在左右側(cè),第一個(gè)參數(shù)都是k呢? 
  36.         // 因?yàn)?,k指的是要找的數(shù)值的下標(biāo)位置(第k大就是下標(biāo)k-1) 
  37.         // 無論在左右側(cè),對(duì)于數(shù)組arr來說,其對(duì)應(yīng)的下標(biāo)都是固定的 
  38.         // 并且 l/r 每次都會(huì)變動(dòng),所以k這里是固定的 
  39.         if k > l { 
  40.             // 這里的  l+1, rr 也是數(shù)組的下標(biāo) 
  41.             return find(k, l+1, rr) 
  42.         }elseif k < l { 
  43.             // k在l的左側(cè) 
  44.             // 這里的  ll, l-1 也是數(shù)組的下標(biāo) 
  45.             return find(k, ll, l-1) 
  46.         } 
  47.  
  48.         // 此時(shí)目標(biāo)自位置l處的target,就是第k個(gè)大的數(shù)值 
  49.         return target 
  50.     } 
  51.  
  52.     // 第k大的數(shù)值,對(duì)應(yīng)排序之后就是,數(shù)組下標(biāo)k-1 
  53.     finds := find(k-1, 0, len(arr)-1) 
  54.  
  55.     return finds 

 求第K大,則對(duì)數(shù)組排序排列。

求第K小,則對(duì)數(shù)組正序排列。

無論如何,都是從頭開始找,這樣處理更簡(jiǎn)單。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-06-29 23:34:35

無序數(shù)據(jù)數(shù)組

2021-02-01 10:17:14

編程C語言計(jì)算機(jī)

2017-07-18 10:50:38

前端JavaScript排序算法

2018-04-25 08:10:50

算法k-means代碼

2016-01-29 11:00:55

數(shù)據(jù)挖掘算法大數(shù)據(jù)

2011-01-26 09:14:43

數(shù)據(jù)挖掘

2021-10-31 07:38:37

排序算法代碼

2021-10-18 11:29:48

奇偶排序數(shù)組數(shù)據(jù)結(jié)構(gòu)算法

2022-04-06 10:06:37

判斷算法數(shù)值校驗(yàn)

2022-03-10 12:03:33

Python算法代碼

2013-02-25 09:46:35

數(shù)據(jù)挖掘算法ICDM

2014-08-29 09:56:47

排序數(shù)組編程技巧

2018-10-27 15:47:35

CART算法決策樹

2021-02-22 07:58:45

算法進(jìn)程調(diào)度

2015-07-29 15:11:17

Playground數(shù)值算法

2018-11-14 09:40:05

排序算法Java編程語言

2023-10-06 23:56:42

順序查找Python

2019-08-28 11:08:51

排序算法Java

2020-10-15 12:30:37

Python編程語言

2021-10-14 11:31:28

數(shù)組面試題中心下標(biāo)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)