Example 1:
Input: [[1,2], [1,3], [2,3]] Output: [2,3] Explanation: Original tree will be like this: 1 / \ 2 - 3
Example 2:
Input: [[1,2], [1,3], [3,1]] Output: [3,1] Explanation: Original tree will be like this: 1 / \\ 2 3
从例子来看,是从给出的起点终点的数组edges中,找出第一个形成环的元素。
思路:
题目中,每个数字代表一个点,定义一个起点与终点的数组begin,begin有2001个元素,begin的下标代表终点,begin的元素代表原始起点(最开始的起点),题目可以化简为找出第一个edge,这个edge的起点和终点都有同样的一个原始起点,即形成环。
初始化为每个起点的终点都指向自身为原始起点。然后遍历edges数组,更新新遍历的点,更新原始起点,直至找到环为止。
以example 1为例,
begin 的下标为 0 1 2 3 ... ...
初始化后元素为 0 1 2 3
[1 2] 进入后的为 0 1 1 3,2的原始起点更新为1
[1 3] 进入后的为 0 1 1 1,3的原始起点更新为1
[2 3] 进入后,发现2与3的原始起点一致,均为1,发现环。
源代码如下:
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int s=2001;
vector<int> begin(s);
for(int i=0;i<s;i++)
begin[i] = i;
for(int i=0;i<edges.size();i++)
{
int x=edges[i][0];
int y=edges[i][1];
// cout<<x<<"and"<<y<<endl;
if(begin[x] == begin[y])
return {x,y};
int needUpdate=begin[y];
for(int j=0;j<s;j++)
{
if(begin[j]==needUpdate)
begin[j]=begin[x];
}
}
return edges[0];
}
};