[分治][动态规划]数组中的第K个最大元素,不同的二叉树
Posted 明月清辉入梦来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[分治][动态规划]数组中的第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 ≤ 数组的长度。
题解:
class Solution {
public:
//minhead
/* int findKthLargest(vector<int>& nums, int k) {
priority_queue<int,vector<int>,greater<int>> p;
//priority_queue<int,vector<int>,less<int>> p;
for(auto i=0;i<nums.size();++i){
p.emplace(nums[i]);
if(i>k-1){
p.pop();
}
}
return p.top();
}
*/
//分而治之
int findKthLargest(vector<int>&nums,int k){
return getIndex(nums,0,nums.size()-1,k);
}
int getIndex(vector<int>&nums,int Low,int High,int k){
int temp=nums[Low];
int low=Low;
int high=High;
while(low<high){
while(high>low&&nums[high]>=temp){
--high;
}
nums[low]=nums[high];
while(high>low&& nums[low]<=temp){
++low;
}
nums[high]=nums[low];
}
nums[low]=temp;
if(low==nums.size()-k)return nums[low];
if(low<nums.size()-k){
return getIndex(nums,low+1,High,k);
}else{
return getIndex(nums,Low,low-1,k);
}
}
};
题目:
不同的搜索树
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
题目解法:
给定一个有序序列 1 ... n,为了根据序列构建一棵二叉搜索树。我们可以遍历每个数字 i,将该数字作为树根,1 ... (i-1) 序列将成为左子树,(i+1) ... n 序列将成为右子树。于是,我们可以递归地从子序列构建子树。
在上述方法中,由于根各自不同,每棵二叉树都保证是独特的。
class Solution {
public:
//动态规划
// G(n): 长度为n的序列的不同二叉搜索树个数。
//F(i,n): 以i为根的不同二叉搜索树个数(1≤i≤n)
//F(i,n)=G(i-1)*G(n-i)
//所以G(n)=∑F(i,n) (i=1...n)
int numTrees(int n) {
if(n<=1)return 1;
vector<int> dp(n+1,0);
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;++i){
for(int j=1;j<=i;++j){
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};
以上是关于[分治][动态规划]数组中的第K个最大元素,不同的二叉树的主要内容,如果未能解决你的问题,请参考以下文章