求解两个编程有关问题,偏向算法
求解两个编程问题,偏向算法
输出n个大于0小于m不重复的随机数。(n<m)
如何快速找到二叉树的两个节点最近的公共祖父节点。
------解决方案--------------------
第一题:
1. 创建一个数组a[m-1],其中依次保存1, 2, ..., m-1 // 挖m-1个坑,每个坑里放一个数
2. 产生一个0到m-2之间的随机数i,输出a[i] // 随机从某个坑里取走一个数
3. a[i] = a[m-2]; // 把最后一个坑里的数填到刚才那个坑里,因为下次就取不到最后一个坑了
4. m--; n--;
5. if (n>0) 回到第二步
第二题:
创建两个链表,分别保存从根到两个节点的路径,然后找这两个链表的第一个不同点。
找路径的方法:链表初始为空,如果根就是目标节点,就把他加入链表,否则就递归左子树和右子树,如果某个子树返回的链表头不为空,就把根插到那个链表的头
输出n个大于0小于m不重复的随机数。(n<m)
如何快速找到二叉树的两个节点最近的公共祖父节点。
------解决方案--------------------
第一题:
1. 创建一个数组a[m-1],其中依次保存1, 2, ..., m-1 // 挖m-1个坑,每个坑里放一个数
2. 产生一个0到m-2之间的随机数i,输出a[i] // 随机从某个坑里取走一个数
3. a[i] = a[m-2]; // 把最后一个坑里的数填到刚才那个坑里,因为下次就取不到最后一个坑了
4. m--; n--;
5. if (n>0) 回到第二步
第二题:
创建两个链表,分别保存从根到两个节点的路径,然后找这两个链表的第一个不同点。
找路径的方法:链表初始为空,如果根就是目标节点,就把他加入链表,否则就递归左子树和右子树,如果某个子树返回的链表头不为空,就把根插到那个链表的头