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;}
};
运行结果
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!