問題描述:
尋找陣列中第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 ...