笔试刷题Day—3

旋转数组中的最小元素

在这里插入图片描述

暴力强拆法

这种解法粗暴,但是违背了题目的用意,下面方法二,二分法。

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); //左
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值