選擇問題——選取第K小元素
今天看到騰訊的一道面試題目,感覺都考的特別基礎,但是自己有時候真的是學的不好,所以現在記下來:
查詢最小的k個元素
題目:輸入n個整數,輸出其中最小的k個。
例如輸入1,2,3,4,5,6,7,8這8個數字,則最小的4個數字為1,2,3,4
這道題目其實就是書上的k小選擇問題,在講述排序演算法的時候其實已經都講過了,只不過當時是輸出一個但是現在是輸出k個,都一樣啊,你找出第k個元素之後,把它左邊的直接輸出就好了,因為陣列已經partition好了。所以這道題目還是k小選擇問題,你看,面試題其實都是書上最基本的題目。
下面是我寫的,和書上的不太一樣,但是結果是一樣的,思想也是一樣的。
==================================================================
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
void swap(int* a,int i,int j){//exchange the items in the array
int tem = a[i];
a[i] = a[j];
a[j] = tem;
}
//print a particular array
void printArray(int* a,int n){
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int Partition(int* a,int left,int right){//partition the array from left to right according to the item on the left
int i = left + 1;
int j = right;
do{
while(a[i]<=a[left]) i++;//左邊是小於等於,右邊是大於
while(a[j] > a[left]) j--;
if(i<j)
swap(a,i,j);
}while(i<j);
//swap(a,left,i);
return j;
}
//select the Kth min element
int selectKMin(int* a,int k,int n){
int left = 0,right = n-1;
do
{
int j = rand()%(right - left + 1)+left;//randomly select the main item
swap(a,left,j);
int i = Partition(a,left,right);
if(i == k-1)
return i;
else if(i < k-1)
left = i;
else
right = i;
}
while(true);
}
int main(){
int a[13] = {2,4,3,1,5,7,23,9,10,33,55,0,23};
int i = selectKMin(a,9,13);
printArray(a,i+1);
}
關鍵還是partition函式。
=============================之後我又改變成了模板:
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
template<typename T>
void swap(T* a,int i,int j){//exchange the items in the array
T tem = a[i];
a[i] = a[j];
a[j] = tem;
}
//print a particular array
template<typename T>
void printArray(T* a,int n){
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
template<typename T>
int Partition(T* a,int left,int right){//partition the array from left to right according to the item on the left
int i = left + 1;
int j = right;
do{
while(a[i]<=a[left]) i++;
while(a[j] > a[left]) j--;
if(i<j)
swap(a,i,j);
}while(i<j);
//swap(a,left,i);
return j;
}
//select the Kth min element
template<typename T>
int selectKMin(T* a,int k,int n){
int left = 0,right = n-1;
do
{
int j = rand()%(right - left + 1)+left;//randomly select the main item
swap(a,left,j);
int i = Partition(a,left,right);
if(i == k-1)
return i;
else if(i < k-1)
left = i;
else
right = i;
}
while(true);
}
int main(){
string a[6] = {"xuyabo","liuxinrui","hahaha","loveyouall","why","but"};
int i = selectKMin(a,3,6);
printArray(a,i+1);
}
相關文章
- 選擇問題(求第k個最小元素)
- TopK問題,陣列中第K大(小)個元素問題總結TopK陣列
- CSS 元素選擇器CSS
- DOM元素的選擇
- 用PriorityQueue解決選擇最小的K個數問題
- 通過css類/選擇器選取元素文件結構和遍歷元素樹的文件CSS
- 如何選擇元素定位方式
- 小程式問題答疑:小程式加盟代理選擇哪家公司好?
- CSS3新增選擇器(屬性選擇器、結構偽類選擇器、偽元素選擇器)CSSS3
- 【爬坑日記】.class.class選擇器的選擇問題
- 這就是選擇排序的問題排序
- 特徵選擇和特徵生成問題初探特徵
- 小程式開發選擇公司等於選擇人
- CSS E::after 偽元素選擇器CSS
- CSS E::before 偽元素選擇符CSS
- 使用simplemind如何選擇多個元素
- 使用 CSS 選擇器實現對不含 title 屬性元素的選擇CSS
- 第k大元素
- MySQL 你可能忽視的選擇問題MySql
- EditText選擇模式的一些問題模式
- 索引選擇度問題最佳化整理索引
- 選擇伺服器需要關注哪些問題伺服器
- 選擇物聯卡時應注意哪些問題
- 選擇物聯網路卡需注意哪些問題
- CSS E::first-line偽元素選擇器CSS
- UI自動化測試-web元素選擇UIWeb
- 偽類選擇器:愛恨法則;偽元素選擇器:before,after;清除浮動
- 002---選擇器(標籤選擇器、類選擇器、id選擇器、偽類選擇器、萬用字元選擇器)字元
- NOIP2011提高組初賽不定項選擇第5題
- jQuery選擇器介紹:基本選擇器、層次選擇器、過濾選擇器、表單選擇器jQuery
- 卷積核大小選擇、網路層數問題卷積
- 淺談5G頻段的選擇問題
- 2 Elment Ui 日期選擇器 格式化問題UI
- 選擇資料分析工具時要注意哪些問題
- 選擇直播美顏工具時應注意哪些問題?
- 活動選擇問題理解貪心演算法演算法
- CSS偽類與偽元素選擇器區別CSS
- 獲取一個陣列裡面第K大的元素陣列
- 排序——選擇排序小練習(二)排序