当前位置:首页 > 编程笔记 > 正文
已解决

Leetcode—2471.逐层排序二叉树所需的最少操作数目【中等】(置换环解法!)

来自网友在路上 190890提问 提问时间:2023-11-12 14:00:20阅读次数: 90

最佳答案 问答题库908位专家为你答疑解惑

2023每日刷题(二十七)

Leetcode—2471.逐层排序二叉树所需的最少操作数目

在这里插入图片描述

置换环解题思想

参考自网络
在这里插入图片描述
在这里插入图片描述
总交换次数 = 每一层最小交换次数之和 = 每一层元素个数 - 置换环数
在这里插入图片描述

实现代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int minimumOperations(TreeNode* root) {queue<TreeNode*> q;q.emplace(root);int ans = 0;while(q.size()) {int len = q.size();vector<int> arr;while(len > 0) {len--;auto u = q.front();q.pop();arr.push_back(u->val);if(u->left != nullptr) {q.push(u->left);}if(u->right != nullptr) {q.push(u->right);}}// 置换环int n = arr.size();vector<int> p(n);iota(p.begin(), p.end(), 0);sort(p.begin(), p.end(), [&](const int &i, const int &j){return arr[i] < arr[j];});int cnt = n;bool vis[n];memset(vis, false, sizeof(vis));for(auto i : p) {if(vis[i]) {continue;}while(!vis[i]) {vis[i] = true;i = p[i];}// 找到一个置换环cnt -= 1;}ans += cnt;}return ans;}
};

运行结果

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Leetcode—2471.逐层排序二叉树所需的最少操作数目【中等】(置换环解法!)":http://eshow365.cn/6-38126-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!