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

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

1. 区间和的个数


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


区间和 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]

f6e46ace5976ecb7788e718bdedf3e62.png

示例 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

目录
相关文章
|
6月前
|
C++
两种解法解决 LeetCode 27. 移除元素【C++】
两种解法解决 LeetCode 27. 移除元素【C++】
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
81 4
|
6月前
|
存储 安全 编译器
【C++ 关键字 类型限定符 】揭秘C++编程中的神秘元素:深入了解volatile关键字的强大作用
【C++ 关键字 类型限定符 】揭秘C++编程中的神秘元素:深入了解volatile关键字的强大作用
54 0
|
5月前
|
C++
C++数组中插入元素。
C++数组中插入元素。
|
4月前
|
安全 编译器 C++
【C++】string类的使用②(元素获取Element access)
```markdown 探索C++ `string`方法:`clear()`保持容量不变使字符串变空;`empty()`检查长度是否为0;C++11的`shrink_to_fit()`尝试减少容量。`operator[]`和`at()`安全访问元素,越界时`at()`抛异常。`back()`和`front()`分别访问首尾元素。了解这些,轻松操作字符串!💡 ```
|
6月前
|
算法 C++
c++算法学习笔记 (12) 区间合并
c++算法学习笔记 (12) 区间合并
|
6月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6月前
|
JSON JavaScript 数据格式
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
【深入探究C++ JSON库】解析JSON元素的层级管理与遍历手段
954 2
|
6月前
|
存储 C++
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
|
6月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
98 1
Linux 终端操作命令(1)