C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

这篇具有很好参考价值的文章主要介绍了C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

目录

1. 区间和的个数  🌟🌟🌟

2. 二叉搜索树的最近公共祖先  🌟

3. 找最接近元素  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 区间和的个数

给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。

区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

示例 1:

输入:nums = [-2,5,-1], lower = -2, upper = 2
输出:3
解释:存在三个区间:[0,0]、[2,2] 和 [0,2] ,对应的区间和分别是:-2 、-1 、2 。

示例 2:

输入:nums = [0], lower = 0, upper = 0
输出:1

提示:

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • -10^5 <= lower <= upper <= 10^5
  • 题目数据保证答案是一个 32 位 的整数

出处:

https://edu.csdn.net/practice/27859951

代码:

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int countRangeSum(vector<int> &nums, int lower, int upper)
    {
        int n = nums.size();
        long presum = 0;
        multiset<long> S;
        S.insert(0);
        int ret = 0;
        for (int i = 0; i < n; i++)
        {
            presum += nums[i];
            ret += distance(S.lower_bound(presum - upper), S.upper_bound(presum - lower));
            S.insert(presum);
        }
        return ret;
    }
};

int main()
{
	Solution s;
	vector<int> nums = {-2, 5, -1};
	int lower = -2, upper = 2;
	cout << s.countRangeSum(nums, lower, upper) << endl;
	nums = {0};
	lower = 0; upper = 0;
	cout << s.countRangeSum(nums, lower, upper) << endl;
	return 0;	
}

输出:

3
1


2. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

出处:

https://edu.csdn.net/practice/27859952

代码:

#define null INT_MIN
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution
{
public:
    TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
    {
        if (root == NULL)
            return NULL;
        if ((root->val > q->val) && (root->val > p->val))
            return lowestCommonAncestor(root->left, p, q);
        else if ((root->val < q->val) && (root->val < p->val))
            return lowestCommonAncestor(root->right, p, q);
        return root;
    }
};

TreeNode* buildTree(vector<int>& nums)
{
    TreeNode *root = new TreeNode(nums[0]);
    queue<TreeNode*> q;
    q.push(root);
    int i = 1;
    while(!q.empty() && i < nums.size())
    {
        TreeNode *cur = q.front();
        q.pop();
        if(nums[i] != null)
        {
            cur->left = new TreeNode(nums[i]);
            q.push(cur->left);
        }
        i++;
        if(i < nums.size() && nums[i] != null)
        {
            cur->right = new TreeNode(nums[i]);
            q.push(cur->right);
        }
        i++;
    }
    return root;
}

int main()
{
	Solution s;
	vector<int> nums = {6,2,8,0,4,7,9,null,null,3,5};
	TreeNode *root = buildTree(nums);
	TreeNode *p = new TreeNode(2);
	TreeNode *q = new TreeNode(8);
	cout << s.lowestCommonAncestor(root, p, q)->val << endl;
	q = new TreeNode(4);
	cout << s.lowestCommonAncestor(root, p, q)->val << endl;
	
	return 0;	
}

输出:

6
2


3. 找最接近元素

目标值与数组所有元素去比对,找出最接近的元素,输出下标。

举例如下:一个数组{915,941,960,976,992,1015,1034,1050,1073,1089,1115,1131,1150,1166,1182,1208,1227};目标值假设是1000,最接近元素为992,下标为4

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <stdio.h>
int main()
{
    int min = (1 << 31) - 1;
    int idx = 0;
    int arr[] = {915, 941, 960, 976, 992, 1015, 1034, 1050, 1073, 1089, 1115, 1131, 1150, 1166, 1182, 1208, 1227};
    int n = 1000;
    for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
    {
        int diff = arr[i] - n;
        if (diff < 0)
            diff = -diff;
        _________________;
    }
    printf("最接近的是%d 下标是%d", arr[idx], idx);
    return 0;
}
```

出处:

https://edu.csdn.net/practice/27859953

代码:

#include <stdio.h>
int main()
{
    int min = (1 << 31) - 1;
    int idx = 0;
    int arr[] = {915, 941, 960, 976, 992, 1015, 1034, 1050, 1073, 1089, 1115, 1131, 1150, 1166, 1182, 1208, 1227};
    int n = 1000;
    for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
    {
        int diff = arr[i] - n;
        if (diff < 0)
            diff = -diff;
        if (diff < min)
        {
            min = diff;
            idx = i;
        }
    }
    printf("最接近的是%d 下标是%d", arr[idx], idx);
    return 0;
}

输出:

最接近的是992 下标是4


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/文章来源地址https://www.toymoban.com/news/detail-445094.html

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

Golang每日一练 专栏

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

Python每日一练 专栏

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

C/C++每日一练 专栏

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

Java每日一练 专栏

到了这里,关于C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++每日一练:最长递增区间 && 阿波罗的魔力宝石 && 投篮

    今天的题太简单,甚至 “最长递增区间” 和 “投篮” 就是一个问题。实在没事干,也给做了!直接上代码算了… 提示:以下是本篇文章正文内容 代码如下: 注意点就是默认值为1。 代码如下: 很简单的冒泡排序,没加flag。 代码如下: 这简直和第一题一模一样!我估计条

    2023年04月26日
    浏览(30)
  • 【LeetCode - 每日一题】1123. 最深叶节点的最近公共祖先(23.09.06)

    返回最深节点的最近公共祖先; 每个节点的 val 互不相同; 节点最多 1000 个; 和经典的 LCA 不同的是,这里的对象是 若干个叶节点(1个或多个,最深的) 。 首先将最深的叶节点找出来: bfs 广搜,用 map 存储每层的节点 记录所有节点的父节点: father 数组(在 bfs 广搜的同

    2024年02月09日
    浏览(25)
  • Golang每日一练(leetDay0065) 位1的个数、词频统计

    目录 191. 位1的个数 Nnumber of 1-bits  🌟 192. 统计词频 Word Frequency  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为

    2024年02月06日
    浏览(51)
  • LeetCode每日一题:1123. 最深叶节点的最近公共祖先(2023.9.6 C++)

    目录 1123. 最深叶节点的最近公共祖先 题目描述: 实现代码与解析: dfs 原理思路:         给你一个有根节点  root  的二叉树,返回它  最深的叶节点的最近公共祖先  。 回想一下: 叶节点  是二叉树中没有子节点的节点 树的根节点的  深度  为  0 ,如果某一节点的

    2024年02月09日
    浏览(46)
  • C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题

    目录 1. 位1的个数  🌟 2. 递归和非递归求和  ※ 3. 俄罗斯套娃信封问题  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中

    2024年02月16日
    浏览(27)
  • DAY23:二叉树(十三)二叉树的最近公共祖先+二叉搜索树的最近公共祖先

    一定要仔细看 提示 ,二叉树 数值不重复 ,意味着后序遍历不会存在两边找到了同个元素的情况 本题需要进一步理解后序遍历, 可以认为后序遍历在\\\"深入\\\"到每个子树的最深层之后,才开始\\\"回溯\\\"并访问节点 。 在某种意义上,这可以被视为从下往上的遍历方式 , 但需要注

    2024年02月09日
    浏览(33)
  • 图论--最近公共祖先LCA

    LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公共祖先是相对于两个节点来说的,一般来说,最近公共祖先为节点 u和节点 v的最近的公共祖先。若 u 为 v 的祖先

    2024年02月03日
    浏览(30)
  • 最近公共祖先(LCA)

    「观前提醒」 「文章仅供学习和参考,如有问题请在评论区提出」 目录 前言 定义 性质 求 LCA 倍增算法 Trajan 算法 树链剖分 基本概念 基本性质 具体实现 参考资料 简单的模板整理,只是概括了一下具体的实现方法(说到底是给自己写的),如果看不明白可以去看原视频(讲

    2024年02月14日
    浏览(20)
  • 「学习笔记」tarjan 求最近公共祖先

    Tarjan 算法是一种 离线算法 ,需要使用并查集记录某个结点的祖先结点。 并没有传说中的那么快。 将询问都记录下来,将它们建成正向边和反向边。 在 dfs 的过程中,给走过的节点打上标记,同时维护并查集,这里利用了回溯的思想,如果 (u) 节点的这棵子树没搜完,那么

    2024年02月01日
    浏览(33)
  • 「学习笔记」tarjan求最近公共祖先

    Tarjan 算法是一种 离线算法 ,需要使用并查集记录某个结点的祖先结点。 并没有传说中的那么快。 将询问都记录下来,将它们建成正向边和反向边。 在 dfs 的过程中,给走过的节点打上标记,同时维护并查集,这里利用了回溯的思想,如果 (u) 节点的这棵子树没搜完,那么

    2024年02月01日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包