【Leetcode -1609.奇偶树 -1122.数组的相对排序】

简介: 【Leetcode -1609.奇偶树 -1122.数组的相对排序】

Leetcode -1609.奇偶树

题目:如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 :

二叉树根节点所在层下标为 0 ,根的子节点所在层下标为 1 ,根的孙节点所在层下标为 2 ,依此类推。

偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增

奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减

给你二叉树的根节点,如果二叉树为 奇偶树 ,则返回 true ,否则返回 false 。

示例 1:

输入:root = [1, 10, 4, 3, null, 7, 9, 12, 8, 6, null, null, 2]

输出:true

解释:每一层的节点值分别是:

0 层:[1]

1 层:[10, 4]

2 层:[3, 7, 9]

3 层:[12, 8, 6, 2]

由于 0 层和 2 层上的节点值都是奇数且严格递增,而 1 层和 3 层上的节点值都是偶数且严格递减,因此这是一棵奇偶树。

示例 2:

输入:root = [5, 4, 2, 3, 3, 7]

输出:false

解释:每一层的节点值分别是:

0 层:[5]

1 层:[4, 2]

2 层:[3, 3, 7]

2 层上的节点值不满足严格递增的条件,所以这不是一棵奇偶树。

示例 3:

输入:root = [5, 9, 1, 3, 5, 7]

输出:false

解释:1 层上的节点值应为偶数。

示例 4:

输入:root = [1]

输出:true

示例 5:

输入:root = [11, 8, 6, 1, 3, 9, 11, 30, 20, 18, 16, 12, 10, 4, 2, 17]

输出:true

提示:

树中节点数在范围[1, 10^5] 内

1 <= Node.val <= 10^6

思路:利用循环队列实现,相当于层序遍历判断,一层一层判断;思路如下:

bool isEvenOddTree(struct TreeNode* root)
    {
        // 先开辟足够空间
        struct TreeNode* queue[100002];
        // front 为队头,出数据从队头出,减减 front 即可
        // rear 为队尾,进数据从队尾进,加加 rear 即可
        // prev 记录前驱节点
        int front = 0, rear = 0, prev;
        // 记录该层是奇还是偶;奇为1 ,偶为0
        int EvenOdd = 0;   
        // 开始先进 root 节点
        queue[rear++] = root;
        // front 不等于 rear,说明队列不为空,继续进入循环
        while (front != rear)
        {
            // cnt 为当前队列的有效节点个数
            int cnt = rear - front;
            // 如果是奇树,定义 prev 为整型的最大值,方便判断每一层上的节点严格递增
            if (EvenOdd)
                prev = INT_MAX;
            // 偶数则定义 prev 为整型的最小值,方便判断每一层上的节点严格递减
            else
                prev = INT_MIN;
            // 在有效节点个数的范围内循环
            for (int i = 0; i < cnt; i++)
            {
                // 出队头的节点
                root = queue[front++];
                // 判断是奇树还是偶树,按照对应的树做对应的判断,不满足则返回 false
                if ((EvenOdd == 0) && (root->val % 2 == 0 || prev >= root->val))
                    return false;
                if ((EvenOdd == 1) && (root->val % 2 != 0 || prev <= root->val))
                    return false;
                prev = root->val;
                // 每出一个数据,判断如果 root 的左子树或右子树不为空,那就进队列
                if (root->left)
                    queue[rear++] = root->left;
                if (root->right)
                    queue[rear++] = root->right;
            }
            // 控制奇树层和偶树层
            EvenOdd = (EvenOdd + 1) % 2;
        }
        return true;
    }

Leetcode -1122.数组的相对排序

题目:给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。

对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

示例 1:

输入:arr1 = [2, 3, 1, 3, 2, 4, 6, 7, 9, 2, 19], arr2 = [2, 1, 4, 3, 9, 6]

输出:[2, 2, 2, 1, 4, 3, 3, 9, 6, 7, 19]

示例 2:

输入:arr1 = [28, 6, 22, 8, 44, 17], arr2 = [22, 28, 8, 6]

输出:[22, 28, 8, 6, 17, 44]

提示:

1 <= arr1.length, arr2.length <= 1000

0 <= arr1[i], arr2[i] <= 1000

arr2 中的元素 arr2[i] 各不相同

arr2 中的每个元素 arr2[i] 都出现在 arr1 中

思路:用hash数组记录arr1中出现元素出现的次数,通过arr2中出现的元素,判断其在arr1中出现的次数,覆盖掉原来arr1中的元素,直到其出现的次数减到0;最后再判断arr1中没有在arr2中出现的元素,直接补在后面即可;代码如下:

int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize)
    {
        // hash数组记录 arr1 数组中出现的元素的次数
        // pos 记录覆盖当前 arr1 数组的长度
        int hash[1001] = { 0 };
        int pos = 0;
        // 记录 arr1 数组中出现的元素的次数
        for (int i = 0; i < arr1Size; i++)
        {
            hash[arr1[i]]++;
        }
        // 遍历 arr2 数组,arr2 中的元素如果在 arr1 中出现,就将 arr2 的元素覆盖在 arr1 中
        // 然后出现的次数减减,一直覆盖直到在 hash 数组中出现的次数为0
        for (int i = 0; i < arr2Size; i++)
        {
            while (hash[arr2[i]] != 0)
            {
                arr1[pos++] = arr2[i];
                hash[arr2[i]]--;
            }
        }
        // 判断 arr1 中没在 arr2 中出现的元素
        // 直接在 arr1 后面补上
        for (int i = 0; i < 1001; i++)
        {
            while (hash[i] != 0)
            {
                arr1[pos++] = i;
                hash[i]--;
            }
        }
        // 最后返回 arr1
        *returnSize = arr1Size;
        return arr1;
    }
目录
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
19 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
58 0
|
1月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
16 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
17 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口