選擇問題——選取第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陣列
- jQuery選擇器獲取前幾個元素jQuery
- 用PriorityQueue解決選擇最小的K個數問題
- DOM元素的選擇
- CSS 元素選擇器CSS
- jq選擇子元素
- jQuery選擇器——子元素過濾選擇器jQuery
- jQuery選擇器——表單元素過濾選擇器jQuery
- 如何選擇元素定位方式
- 通過css類/選擇器選取元素文件結構和遍歷元素樹的文件CSS
- 小程式問題答疑:小程式加盟代理選擇哪家公司好?
- CSS5-選擇器5-子元素選擇器CSS
- jQuery選擇器獲取元素並非是動態jQuery
- CSS3新增選擇器(屬性選擇器、結構偽類選擇器、偽元素選擇器)CSSS3
- 【爬坑日記】.class.class選擇器的選擇問題
- 這就是選擇排序的問題排序
- CSS選擇器常見問題CSS
- CSS選擇器(6)——偽元素CSS
- 小程式開發選擇公司等於選擇人
- jQuery選擇器 標籤選擇元素+css簡單新增移除操作jQueryCSS
- ListView Item 選擇問題解決之道View
- CSS E::after 偽元素選擇器CSS
- 使用simplemind如何選擇多個元素
- jQuery子元素過濾選擇器jQuery
- 使用 CSS 選擇器實現對不含 title 屬性元素的選擇CSS
- 第k大元素
- MySQL 你可能忽視的選擇問題MySql
- EditText選擇模式的一些問題模式
- 特徵選擇和特徵生成問題初探特徵
- 第 13 章 CSS 選擇器[上]CSS
- Oracle建立索引選擇合適的可選項及效率問題Oracle索引
- CSS E::before 偽元素選擇符CSS
- 修改題庫(選擇題) (轉)
- 選擇物聯網路卡需注意哪些問題
- 活動選擇問題理解貪心演算法演算法
- 選擇伺服器需要關注哪些問題伺服器
- 使用jQuery選擇器獲取索引值大於或者小於jQuery索引