剣指offer最小のK個数C++実現
1792 ワード
タイトルの説明:n個の整数を入力して、その中の最小のK個の数を探し出します.例えば4,5,1,6,2,7,3,8の8つの数字を入力すると、最小の4つの数字は1,2,3,4である.
まず,特殊な場合の配列が空であるか,Kが0であるか,Kが配列長より大きいかを考慮する.
次に、どのような方法でソートするかを考えます.
1、C++標準ライブラリsortを使用する
標準ライブラリのsort関数のデフォルトは、小さいものから大きいものまでソートされます.大きいものから小さいものへのソートを実現するには、3番目のパラメータgreater()を追加する必要があります.
時間の複雑さを分析しましょう.
2、快速列
時間複雑度:O(nlog 2 n).
まず,特殊な場合の配列が空であるか,Kが0であるか,Kが配列長より大きいかを考慮する.
次に、どのような方法でソートするかを考えます.
1、C++標準ライブラリsortを使用する
class Solution {
public:
vector GetLeastNumbers_Solution(vector input, int k) {
vector tmp;
if(input.empty() || k == 0 || k > input.size()) return tmp;
sort(input.begin(), input.end());
tmp.assign(input.begin(), input.begin() + k);
return tmp;
}
};
標準ライブラリのsort関数のデフォルトは、小さいものから大きいものまでソートされます.大きいものから小さいものへのソートを実現するには、3番目のパラメータgreater()を追加する必要があります.
時間の複雑さを分析しましょう.
std::sort
は、平均的な場合の線形O(n log n)時間の複雑さを有しなければならない.2、快速列
class Solution {
public:
int Partition(vector& v, int low, int high){
int pivot = v[low];
while(low < high){
while(low < high && v[high] >= pivot) high--;
v[low] = v[high];
while(low < high && v[low] <= pivot) low++;
v[high] = v[low];
}
v[low] = pivot;
return low;
}
void QuickSort(vector& v, int low, int high){
if(low < high){
int pivotpos = Partition(v, low, high);
QuickSort(v, low, pivotpos - 1);
QuickSort(v, pivotpos + 1, high);
}
}
vector GetLeastNumbers_Solution(vector input, int k) {
vector tmp;
if(input.empty() || k == 0 || k > input.size()) return tmp;
QuickSort(input, 0, input.size() - 1);
tmp.assign(input.begin(), input.begin()+k);
return tmp;
}
};
時間複雑度:O(nlog 2 n).