class Solution {
public:
// 如果做题的时候不允许使用内置的排序函数,下面是归并排序和快速排序的代码
// 合并两个已排序的部分
void merge(vector<int>& arr, int left, int mid, int right) {
int n1 = mid - left + 1; // 左侧子数组长度
int n2 = right - mid; // 右侧子数组长度
// 创建临时数组
vector<int> L(n1), R(n2);
// 复制数据到临时数组
for (int i = 0; i < n1; ++i) {
L[i] = arr[left + i];
}
for (int i = 0; i < n2; ++i) {
R[i] = arr[mid + 1 + i];
}
// 合并临时数组回原数组
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// 复制剩余元素
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// 归并排序,时间复杂度 O(N log N)
void mergeSort(vector<int>& arr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid); // 排序左半部分
mergeSort(arr, mid + 1, right); // 排序右半部分
merge(arr, left, mid, right);
}
}
// 快速排序,时间复杂度 O(N log N)
void quickSort(vector<int>& arr, int left, int right) {
if (left >= right) return;
// 选择枢轴元素
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
// 从右往左找小于 pivot 的元素
while (i < j && arr[j] >= pivot) j--;
if (i < j) arr[i++] = arr[j];
while (i < j && arr[i] <= pivot) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = pivot; // 把 pivot 放到最终位置上
quickSort(arr, left, i - 1); // 递归地对左侧子数组进行快速排序
quickSort(arr, i + 1, right); // 递归地对右侧子数组进行快速排序
}
// 归并排序
// 判断一个数是否是质数
bool isPrime(int num) {
if (num <= 1) return false;
if (num <= 3) return true;
if (num % 2 == 0 || num % 3 == 0) return false;
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param trees int整型vector
* @return int整型vector
*/
vector<int> primeFruits(vector<int>& trees) {
// write code here
vector<int> primeF;
for (int fruit : trees) {
if (isPrime(fruit)) {
primeF.push_back(fruit);
}
}
// sort(primeF.begin(), primeF.end());
// 这道题逻辑上不复杂,就是判断质数加一个排序,面试遇到估计会不让用内置的排序
// 自己手撕排序的话,我写一下快排或归并
// quickSort(primeF, 0, primeF.size() - 1);
mergeSort(primeF, 0, primeF.size() - 1);
return primeF;
}
};