第一篇博客,起因是找实习,但是太菜了,本科和研究生期间编码量太少,在字节面试手撕代码环节非常痛苦,也没撕出来,但是面试官非常好,给我了建议,让我先敲数据结构书的课后题。
我选的数据结构书是数据结构与算法分析 C++语言描述 Mark那版。
下面是1.1 编写一个程序解决选择问题。还不太会算时间复杂度,时间复杂度先空着……
//1.1 编写程序解决选择问题,就是在N个数里面选第K个最大的数。
#include<iostream>
#include<vector>
#include <cassert>
int partition(std::vector<int>& arr, int K, int left, int right)
{
int i = left;
int j = right;
int mid = left + (right - left) / 2;
assert(K <= right && K >= left);
//用了一个三数取中
if (arr[i] > arr[j]) std::swap(arr[i], arr[j]);
if (arr[mid] > arr[j]) std::swap(arr[mid], arr[j]);
if (arr[i] < arr[mid]) std::swap(arr[i], arr[mid]);
int pivot = arr[i];
while (j != i)
{
while (j > i && arr[j] >= pivot) j--;
while (j > i && arr[i] <= pivot) i++;
if (j > i)
std::swap(arr[i], arr[j]);
}
std::swap(arr[i], arr[left]);
if (i == K) //找到了就返回
{
return arr[i];
}
else if (i < K)
{
return partition(arr, K, i + 1, right);
}
else if (i > K)
{
return partition(arr, K, left, i - 1);
}
}
int main()
{
std::vector<int>arr{ 1,5,6,3,2,9 };
int len = arr.size();
int K = 6;
int res = partition(arr, len - K, 0, len - 1);
std::cout << res << std::endl;
}