腾讯精选50题—Day14题目 215,217,230
第十四天~
1. 题目 215 寻找第K大的数 经典面试题
(1) 题目描述
(2) 思路
利用快排中的partition+双指针。
(3) 题解
class Solution {
private:
int partition(vector<int>& nums, int left, int right) {
// 随机在 [left, right] 中, 选择一个数值作为标定点 pivot
swap(nums[left], nums[rand() % (right - left + 1) + left]);
int pivot = nums[left];
while (left < right) {
while (left < right & nums[right] >= pivot) {
right--;
}
nums[left] = nums[right];
while (left < right & nums[left] < pivot) {
left++;
}
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
public:
int findKthLargest(vector<int>& nums, int k) {
int size = nums.size();
int target = size - k;
int left = 0;
int right = size - 1;
while (true) {
int p = partition(nums, left, right);
if (p == target) {
return nums[p];
}
else if (target < p) {
right = p - 1;
}
else {
left = p + 1;
}
}
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目 217 存在重复元素
(1) 题目描述
(2) 思路
使用一个Hash表,当插入新元素到Hash表时,如果里面存在相同元素,那么返回False,否则,返回True。
(3) 题解
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> s;//hash
for (int x : nums)
{
if (s.find(x) != s.end())
return true;
s.insert(x);
}
return false;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
3. 题目
(1) 题目描述
(2) 思路
二叉排序树的特性就是中序遍历后得到的序列是有序的,所以我们对二叉排序树进行中序遍历,然后将第k个遍历到的数存储即可。
(3) 题解
递归解法:
class Solution {
public:
TreeNode* result;
int kthSmallest(TreeNode* root, int k) {
Travel(root, k);
return result->val;
}
void Travel(TreeNode* root, int &k)
{
if (root == NULL)
{
return;
}
Travel(root->left, k);
k--;
if (k == 0)
{
result = root;
return;
}
Travel(root->right, k);
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n) n为二叉树的结点数
空间复杂度:
O
(
1
)
O(1)
O(1)