成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

經典算法:無序數組尋找第K大的數值

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

[[409182]]

1. 尋找第K大

題意

有一個無序整數數組,請你根據排序思路,找出數組中第K大的數。

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

示例

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

2. 常規思路

先對無序數組進行排序,然后對有序數組進行查找。

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

先看一下,各種排序算法的復雜度以及穩定性。

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

3. 解題思路

常規思路需要兩大步:

  1. 先整體排序
  2. 在有序中查找目標值

那么,針對這道題,我們能不能在排序的過程中就確定目標值呢?

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

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

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

經典算法:無序數組尋找第K大的數值

動圖 - 快排算法

快排算法查找過程:

4. Go代碼實現

  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.         // 對于正常的快排,需要下面的代碼 
  10.         if l >= r { 
  11.             return 
  12.         } 
  13.         // 然而這里不需要,在尋找第k大的數據時 一般是 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的右側 
  35.         // 為什么 下面無論是在左右側,第一個參數都是k呢? 
  36.         // 因為,k指的是要找的數值的下標位置(第k大就是下標k-1) 
  37.         // 無論在左右側,對于數組arr來說,其對應的下標都是固定的 
  38.         // 并且 l/r 每次都會變動,所以k這里是固定的 
  39.         if k > l { 
  40.             // 這里的  l+1, rr 也是數組的下標 
  41.             return find(k, l+1, rr) 
  42.         }elseif k < l { 
  43.             // k在l的左側 
  44.             // 這里的  ll, l-1 也是數組的下標 
  45.             return find(k, ll, l-1) 
  46.         } 
  47.  
  48.         // 此時目標自位置l處的target,就是第k個大的數值 
  49.         return target 
  50.     } 
  51.  
  52.     // 第k大的數值,對應排序之后就是,數組下標k-1 
  53.     finds := find(k-1, 0, len(arr)-1) 
  54.  
  55.     return finds 

 求第K大,則對數組排序排列。

求第K小,則對數組正序排列。

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

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-06-29 23:34:35

無序數據數組

2021-02-01 10:17:14

編程C語言計算機

2017-07-18 10:50:38

前端JavaScript排序算法

2018-04-25 08:10:50

算法k-means代碼

2011-01-26 09:14:43

數據挖掘

2016-01-29 11:00:55

數據挖掘算法大數據

2021-10-31 07:38:37

排序算法代碼

2021-10-18 11:29:48

奇偶排序數組數據結構算法

2022-03-10 12:03:33

Python算法代碼

2013-02-25 09:46:35

數據挖掘算法ICDM

2022-04-06 10:06:37

判斷算法數值校驗

2018-10-27 15:47:35

CART算法決策樹

2018-11-14 09:40:05

排序算法Java編程語言

2021-02-22 07:58:45

算法進程調度

2023-10-06 23:56:42

順序查找Python

2014-08-29 09:56:47

排序數組編程技巧

2015-07-29 15:11:17

Playground數值算法

2018-11-02 11:03:12

2019-08-28 11:08:51

排序算法Java

2021-11-08 15:12:48

排序算法面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产一区二区三区成人影院 | 成人免费视频网站在线看 | 久久久久久艹 | av中文在线播放 | 欧美精品一区二区三区四区 | 天天射中文 | 一区二区三区国产精品 | 超碰电影| 成人精品一区二区 | 久久精品二区亚洲w码 | 中文字幕一区二区三区日韩精品 | 黄色免费网址大全 | 国产精品久久久久久影视 | 日本中文字幕一区 | 欧美精品电影一区 | 国产小视频在线观看 | 拍拍无遮挡人做人爱视频免费观看 | jizjizjiz中国护士18 | 亚洲 欧美 另类 综合 偷拍 | 狠狠av | 欧美在线视频观看 | 国产成人小视频 | 97国产超碰| 日本超碰 | 97超碰人人 | 成人免费观看网站 | 91私密视频 | 色花av| 国产一区二区不卡 | 欧美日韩成人网 | 91一区二区在线观看 | 99精品国产在热久久 | 国产亚洲精品精品国产亚洲综合 | 久久91精品| 欧美一级二级三级视频 | 久久免费看 | 国产在线观看一区二区三区 | 精久久久 | 97色在线观看免费视频 | 国产综合精品一区二区三区 | 欧美爱爱视频网站 |