首页 > 其他分享 >最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目

最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目

时间:2024-01-20 18:01:27浏览次数:26  
标签:TreeNode val 2471 idx 最少 二叉树 var new root

void Main()
{
	var root = new TreeNode(1)
	{
		left = new TreeNode(3)
		{
			left = new TreeNode(7),
			right = new TreeNode(6)
		},
		right = new TreeNode(2)
		{
			left = new TreeNode(5),
			right = new TreeNode(4)
		}
	};
	var r = new Solution().MinimumOperations(root);
	r.Dump();
}

public class Solution
{
	public int MinimumOperations(TreeNode root)
	{
		var res = 0;
		var queue = new Queue<TreeNode>();
		queue.Enqueue(root);
		while (queue.Count > 0)
		{
			var count = queue.Count;
			var arr = new int[count];
			var idx = new int[count];
			for (int i = 0; i < count; i++)
			{
				root = queue.Dequeue();
				arr[i] = root.val;
				idx[i] = i;
				if (root.left != null) queue.Enqueue(root.left);
				if (root.right != null) queue.Enqueue(root.right);
			}

			if (count == 1)
			{
				continue;
			}

			Array.Sort(idx, (i, j) => arr[i] - arr[j]);

			var k = 0;
			for (int i = 0; i < count; i++)
			{
				while (idx[i] != i)
				{
					var val = idx[i];
					idx[i] = idx[val];
					idx[val] = val;
					k++;
				}
			}
			res += k;

			//置换环:感觉比我自己的写法好不了多少,还多了个hash,
			//上面我的写法,交换多了点,如果不交换,也需要建个hash。
			/*
			例如在数组 [2,0,1,4,3][2,0,1,4,3][2,0,1,4,3] 中,[2,0,1][2,0,1][2,0,1] 和 [4,3][4,3][4,3] 分别是两个置换环,
			环与环之间是数字是不需要发生交换的,只会在环内发生交换。
怎么找到环呢?从第一个数开始,把这个数字当成下标去访问数组,不断循环直到回到这个数本身。
我们只需要计算每个环内需要多少次交换。对于每个环,交换次数为环的大小减一。
			*/

			//var hash = new HashSet<int>();
			//for (int i = 0; i < count; i++)
			//{
			//	if (hash.Contains(i)) continue;
			//	var k = 1;
			//	var val = idx[i];
			//	while (val != i)
			//	{
			//		hash.Add(val);
			//		k++;
			//		val = idx[val];
			//	}
			//	res += (k - 1);
			//}
		}
		return res;
	}
}

  

标签:TreeNode,val,2471,idx,最少,二叉树,var,new,root
From: https://www.cnblogs.com/refuge/p/17976871

相关文章

  • 遍历二叉树
    二叉树前言二叉树的遍历主要有深度优先遍历和广度优先遍历,深度优先遍历是优先访问一个子树上的所有节点,访问的属性是竖向的,而广度优先遍历则是优先访问同一层的所有节点,访问属性是横向的。深度优先遍历深度优先遍历主要有三种顺序:前序遍历——根左右中序遍历——左根......
  • 二叉树 - 二叉树入门题
    二叉树入门题1.判断两颗树是否相同classSolution{publicbooleanisSameTree(TreeNodep,TreeNodeq){//如何判断两颗树是否相同?根相同+左右子树相同//如何判断根相同?结构+值相同if(p==null&&q!=null||p!=null&&......
  • 「暴力」拿出最少数目的魔法豆(力扣第2171题)
    本题为1月18日力扣每日一题题目来源:力扣第2171题题目tag:数位dp动态规划题面题目描述给定一个正整数数组beans,其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中拿出一些豆子(也可以不拿出),使得剩下的非空袋子中(即至少还有一颗魔法豆的袋子)魔法豆的数目相等......
  • 二叉树结构与递归实现前中后序遍历
    1.二叉树结构2.二叉树节点遍历顺序前序:每颗子树以中—》左—》右遍历ABDEHCFG 中序:每颗子树以左 —》中—》右遍历DBEHAFCG 后序:每颗子树以左 —》右—》中遍历DHEBFGCA 代码实现:publicclassBinaryTree{stat......
  • 二叉树的公共祖先
    最开始做的时候,就先想到的是找父节点的那个函数,于是先把目标节点的所以祖先节点存起来,然后一个一个进行比对,当然这样耗时很大。点击查看代码classSolution{public:vector<TreeNode*>vp,vq;TreeNode*findfa(TreeNode*root,TreeNode*k){if(!root){returnNULL;}if(ro......
  • 代码随想录 day21 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
    二叉搜索树的最小绝对差二叉搜索树就是有序数组那么转换一下就很简单了也可以直接在遍历二叉搜索树的时候进行比较需要一个指针记录前一个节点二叉搜索树中的众数既可以把这题的二叉搜索树当成一般树来做这样就是层序遍历树然后用map记录频率再取频率最高的值这里用......
  • 关于二叉树递归代码的粗鄙理解
    整体来看,二叉树的递归代码,可以分为终止条件,单层递归逻辑。单层递归逻辑就是所谓的根左右那三种,选哪一种也是有讲究的,如果不需要对根节点进行处理,那三种都可以。如果题目侧重与由子节点推到父节点,就采用后序遍历。如果题目侧重与由父节点推到子节点,就采用前序遍历。终止条件怎......
  • 代码随想录 day20 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
    最大二叉树前序遍历递归效率不高因为每次都要新开数组给左右子树可以在同一个数组上做这个事情合并二叉树一开始不知道怎么同时遍历两棵树其实只要同时传入两棵树的节点就可以了这里判断两棵树谁空就另外一个作为构造树全为空那就会构造空节点二叉搜索树中的搜索......
  • 非递归形式遍历二叉树
    最简单的就是前序遍历,每次将栈顶元素插入数组中。但要注意由于栈的性质,先push右节点再push左节点。点击查看代码classSolution{public:vector<int>preorderTraversal(TreeNode*root){vector<int>v;stack<TreeNode*>stk;if(root!=NULL){stk.push(root);}while(!......
  • 一套模板搞定二叉树算法题--二叉树算法讲解002
    1、二叉树的递归递归:2、二叉树遍历之DFS深度优先遍历2.1、遍历的概念每个节点都要恰好被访问一次,本质上是二叉树的线性化。一个树形的结构,线性化为一个数组之类的"串"的结构。2.2、DFS深度优先遍历示例二叉树原型图:2.2.1、前序遍历前序遍历执行顺序:根节点--对左子......