這個題目很常見,方法也很多,這裡總結了程式設計之美給出的幾個比較好的方法,也算是對這個問題的乙個總結。
方法一、partition演算法,每次partition的複雜度為o(n),總的平均時間複雜度為o(nlogn)
分析:運用partition演算法,如果返回的provit > k-1,則說明要找的數都在前面,把end= provit-1;如果provit < k-1,表明找到一部分,先把部分資料儲存,然後start = provit + 1;如果正好相等,則儲存後結束,具體**如下:
int partition(vector& numbers,int start,int end)//此partition為了滿足題目的需要,把大的資料移到前面
numbers[start] = provit;
return start;
}vectorsearchthekthnum(vector& numbers,int k)
else//找到全部
}return res;
}
方法二、堆排序
分析:建立乙個大根堆,每次取堆頂元素後,調整堆,迴圈k次後即可,時間複雜度為o(nlogn)
void shiftdown(vector& numbers,int index,int length)//向下調整堆
}vectorsearchthekthnum(vector& numbers,int k)
}vectorsearchthekthnum(vector& numbers,int k)
} return res;
}
方法
四、位位元(適用範圍:資料是沒有重複的整數)
分析:和方法三類似,只是這裡用乙個bit表示乙個資料,優點就是節省空間,缺點就是只能用於沒有重複資料的查詢,例如查詢ip、**號碼等
void getthemaxandminvalue(vector& numbers,int& max,int& min,int length)
}void bit_set(int& data,int index)
vectorsearchthekthnum(vector& numbers,int k)
shift -= 1;
} }return res;
}
以上若有不對的地方,歡迎指正,謝謝
程式設計之美 尋找最大的K個數
有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...
程式設計之美 尋找最大的K個數
有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...
程式設計之美 尋找最大的k個數
有很多無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個數呢?idea 1 先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o nlogn o k o nlogn idea 2 進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o n k 根據k與logn的大小比較,選取...