旋转数组中的最小元素
暴力强拆法
这种解法粗暴,但是违背了题目的用意,下面方法二,二分法。
class Solution {
public:
int minArray(vector<int>& numbers) {
int len = numbers.size();
int min = numbers[0];
for(int i =0;i<len;i++){
if(min > numbers[i])
min = numbers[i];
}
return min;
}
};
官方:二分法
官方使用:int pivot = low + (high - low) / 2;
是为了防止high + low 数值加爆int。
class Solution {
public:
int minArray(vector<int>& numbers) {
int low = 0;
int high = numbers.size() - 1;
while (low < high) {
int pivot = low + (high - low) / 2;
if (numbers[pivot] < numbers[high]) {
high = pivot;
}
else if (numbers[pivot] > numbers[high]) {
low = pivot + 1;
}
else {
high -= 1;
}
}
return numbers[low];
}
};
二叉树节点的删除
已经超过能力范围之外了,还需要细细琢磨。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == nullptr) {return nullptr;} //未找到此结点
else if(key < root->val){//递归到左子树
root->left = deleteNode(root->left, key);
return root;
}
else if(key > root->val){//递归到右子树
root->right = deleteNode(root->right, key);
return root;
}
else{//找到此结点
if(root->left && root->right){//被删除结点有左右结点,对应情况3
TreeNode *successor = root->right;
while (successor->left) {//找到右子树最小结点(也可以找左子树最大结点)
successor = successor->left;
}
root->right = deleteNode(root->right, successor->val);
successor->right = root->right;
successor->left = root->left;//此结点移动到被删除的结点的位置
return successor;
}
//被删除结点有一个或没有子结点,对应情况2或1
else if(root->right == nullptr) {return root->left;}
else if(root->left == nullptr) {return root->right;}
else {return nullptr;}
}
}
};
二叉搜索树的第K大节点
二叉搜索树的中序遍历是:左=>根=>右; 二叉搜索树的中序遍历从小到大是有序的。
因此求二叉搜索树第 k大的节点” 可转化为求 “二叉搜索树的中序遍历倒序的第k 个节点”。
过程如下:
1、按照右->根->左的顺序(中序遍历倒序)遍历二叉树
2、我们每次遍历一个节点的时候就让k–,当k减为0时,我们就找到了第k大的节点。
作者:lin-shen-shi-jian-lu-k
答案链接
来源:力扣(LeetCode)
class Solution {
public:
int res;
int kthLargest(TreeNode* root, int k) {
dfs(root,k);
return res;
}
void dfs(TreeNode* root ,int &k) //传引用 这里需要保证所有dfs函数共用一个k
{
if(!root) return;
dfs(root->right,k); //右
k--;
if(!k) res = root->val; //根
dfs(root->left,k); //左
}
};