LeetCode215.217.230题解
215. 数组中的第K个最大元素
题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
C++代码
class Solution {
public:
int find(vector<int>& nums,int low,int high) {
int pivot = nums[low];
while(low < high){
while(nums[high] >= pivot && high > low) high--;
swap(nums[high],nums[low]);
while(nums[low] <= pivot && high > low) low++;
swap(nums[high],nums[low]);
}
nums[low] = pivot;
return low;
}//快排
int findKthLargest(vector<int>& nums, int k) {
int l = 0,r = nums.size()-1;
k = nums.size()-k;
while(1){
int idx = find(nums,l,r);
if(idx == k) return nums[idx];
else if(idx > k) r = idx-1;
else l = idx+1;
}
return 0;
}//找数
};
217. 存在重复元素
题目描述
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
C++代码
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
int n = nums.size();
if (n <= 1) {
return false;
}
unordered_map<int, int> count;
for (int i = 0; i < n; ++i) {
count[nums[i]]++;
if (count[nums[i]] >= 2) {
return true;
}
}
return false;
}//利用STL的unordered_map实现哈希表
};
230. 二叉搜索树中第K小的元素
题目描述
给定一个二叉搜索树,编写一个函数 kthSmallest
来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest
函数?
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> s;//栈s
int num=0;
TreeNode *cur=root;
while(!s.empty() || cur)
{
if(cur)
{
s.push(cur);
cur=cur->left;
}
else
{
cur=s.top();
s.pop();
num++;
if(num==k)
return cur->val;
cur=cur->right;
}
}
return 0;
}
};//非递归