​LeetCode刷题实战272:最接近的二叉搜索树值 II

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 最接近的二叉搜索树值II,我们先来看题面:

https://leetcode-cn.com/problems/closest-binary-search-tree-value-ii/

Given a non-empty binary search tree and a target value, find k values in the BST that are closest to the target.

Note:

Given target value is a floating point.

You may assume k is always valid, that is: k ≤ total nodes.

You are guaranteed to have only one unique set of k values in the BST that are closest to the target.

给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。

注意:

给定的目标值 target 是一个浮点数

你可以默认 k 值永远是有效的,即 k ≤ 总结点数

题目保证该二叉搜索树中只会存在一种 k 个值集合最接近目标值

示例

示例:
输入: root = [4,2,5,1,3],目标值 = 3.714286,且 k = 2

     4
   / \
  2  5
 / \
1   3

输出: [4,3]

解题

https://michael.blog.csdn.net/article/details/107232667

使用stack,中序遍历bst,是有序的

将差值最小的k个元素的<差值,自身值>插入优先队列

队列满了k个,且差值为正,且大于堆顶,可以提前结束

struct cmp
{
  bool operator()(vector<double>& a, vector<double>& b)
  {
    return a[0] < b[0];//差值大的在上
  }
};
class Solution {
public:
    vector<int> closestKValues(TreeNode* root, double target, int k) {
        stack<TreeNode*> s;
        priority_queue<vector<double>, vector<vector<double>>, cmp> q;
        TreeNode* cur;
        while(root || !s.empty())
        {
          while(root)
          {
            s.push(root);
            root = root->left;
          }
          cur = s.top();
          s.pop();
          root = cur->right;
          if(q.size() < k)
            q.push({fabs(cur->val-target), double(cur->val)});
          else if(q.size()==k && q.top()[0] > fabs(cur->val-target))
          { //有更小的差值
            q.pop();
            q.push({fabs(cur->val-target), double(cur->val)});
          }
          if(q.size()==k && cur->val-target >= q.top()[0])
            break;
        }
        vector<int> ans(k);
        int i = 0;
        while(!q.empty())
        {
          ans[i++] = q.top()[1];
          q.pop();
        }
        return ans;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-260题汇总,希望对你有点帮助!

LeetCode刷题实战261:以图判树

LeetCode刷题实战262:行程和用户

LeetCode刷题实战263:丑数

LeetCode刷题实战264:丑数 II

LeetCode刷题实战265:粉刷房子II

LeetCode刷题实战266:回文排列

LeetCode刷题实战267:回文排列II

LeetCode刷题实战268:丢失的数字

LeetCode刷题实战269:火星词典

LeetCode刷题实战270:最接近的二叉搜索树值

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值