刷題 陣列中第k大的元素 醜數

2021-10-03 17:53:02 字數 2240 閱讀 4799

問題描述:

尋找陣列中第k大的元素

問題解析:

從陣列中尋找第k大的元素,當然暴力解法就是將陣列進行排序然後找到對應的元素,時間複雜度為o(nn)。減少時間複雜度,將陣列進行k次的排序,每次找最大的元素,第k次的尋找就是第k大的元素,時間複雜度為o(nk)。

**如下:

//尋找陣列中第n個最大值,時間複雜度為o(n*k)

public

static

intkthlargestelement

(int n,

int[

] nums)}}

return nums[n-1]

;}

但是對於測試時,要求時間複雜度為o(n)。

首先提一下快速排序:

快速排序是從陣列中選取乙個值作為乙個固定的值,比該值大的放在值的右邊,比該值小的元素放在該元素的左邊。如果當前的k值》右邊的元素個數,說明第k大的數在左邊位置,因此只需處理左邊區域的元素,否則處理右邊區域的元素。

快速排序的**如下:

//快速排序

public

static

void

quicksort

(int

arr )

public

static

void

quicksort

(int

arr,

int left,

int right)

while

(arr[r]

>=tmp && r>l)

if(r>l)

} arr[right]

= arr[r]

; arr[r]

= tmp;

quicksort

(arr,left,l-1)

;//處理左邊元素

quicksort

(arr,l+

1,right)

;//處理右邊元素

}//交換兩個元素的位置

public

static

void

swap

(int

arr,

int i,

int j)

求陣列中第k個最大的元素**如下:

注意的是,如果當前第k個元素在左邊的區域,那麼重新進行處理時,需要減去右邊的元素個數。

public

class

solution

public

static

intquicksort

(int

arr,

int left,

int right,

int k)

while

(arr[r]

>=tmp && r>l)

if(r>l)

} arr[right]

= arr[r]

; arr[r]

= tmp;

if(right - r+

1== k)

else

if(right - r+

1< k)

//處理左邊元素的值,需要減去右邊區域的元素個數

else

}//交換兩個元素的位置

public

static

void

swap

(int

arr,

int i,

int j)

}

問題描述:

醜數,找出只含素因子2,3,5 的第 n 小的數,預設1是第乙個醜數。

問題分析:

需要找到第n個醜數,需要對n個元素大小的陣列進行維護,將醜數放入該書組。陣列中的元素進行2,3,5因子進行擴充套件每次將最小的放入陣列的當前位置,直到陣列存滿為止。

**如下:

public

class

solution

return arr[n-1]

;}}

陣列中第k大的元素

問題描述 在未排序的陣列中找到第 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 總是有效...

陣列中第k大的數

方法 有兩種。參見 第一種 使用排序 快速排序 將陣列排序後,第k大的數就在第k個位置上。演算法複雜度 o n logn 第二種 類似快速排序的變種。通過二分的思想,找到第k大的數字,而不必對整個陣列排序。從陣列中隨機選乙個數t,通過讓這個數和其它數比較,我們可以將整個陣列分成了兩部分並且滿足,在將...

經典演算法題 尋找陣列中第k大的元素

問題描述 在陣列中找到第 k 大的元素。要求時間複雜度為o n 空間複雜度為o 1 分析 此類問題為排序問題,主要難點在於時間複雜度為o n 採用快速排序演算法進行排序 function quicksort nums,k,start,end var left start,right end var ...