@@ -18875,18 +18875,18 @@
18875
18875
<ul class="md-nav__list">
18876
18876
18877
18877
<li class="md-nav__item">
18878
- <a href="#solution-1" class="md-nav__link">
18878
+ <a href="#solution-1-dfs " class="md-nav__link">
18879
18879
<span class="md-ellipsis">
18880
- Solution 1
18880
+ Solution 1: DFS
18881
18881
</span>
18882
18882
</a>
18883
18883
18884
18884
</li>
18885
18885
18886
18886
<li class="md-nav__item">
18887
- <a href="#solution-2" class="md-nav__link">
18887
+ <a href="#solution-2-union-find " class="md-nav__link">
18888
18888
<span class="md-ellipsis">
18889
- Solution 2
18889
+ Solution 2: Union-Find
18890
18890
</span>
18891
18891
</a>
18892
18892
@@ -82160,7 +82160,11 @@ <h2 id="description">Description</h2>
82160
82160
<h2 id="solutions">Solutions</h2>
82161
82161
<!-- solution:start -->
82162
82162
82163
- <h3 id="solution-1">Solution 1</h3>
82163
+ <h3 id="solution-1-dfs">Solution 1: DFS</h3>
82164
+ <p>We create an array $\textit{vis}$ to record whether each city has been visited.</p>
82165
+ <p>Next, we traverse each city $i$. If the city has not been visited, we start a depth-first search from that city. Using the matrix $\textit{isConnected}$, we find the cities directly connected to this city. These cities and the current city belong to the same province. We continue the depth-first search for these cities until all cities in the same province have been visited. This counts as one province, so we increment the answer $\textit{ans}$ by $1$. Then, we move to the next unvisited city and repeat the process until all cities have been traversed.</p>
82166
+ <p>Finally, return the answer.</p>
82167
+ <p>The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Here, $n$ is the number of cities.</p>
82164
82168
<div class="tabbed-set tabbed-alternate" data-tabs="1:6"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label><label for="__tabbed_1_6">Rust</label></div>
82165
82169
<div class="tabbed-content">
82166
82170
<div class="tabbed-block">
@@ -82284,7 +82288,7 @@ <h3 id="solution-1">Solution 1</h3>
82284
82288
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">ans</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
82285
82289
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">vis</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
82286
82290
<span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">vis</span><span class="p">,</span><span class="w"> </span><span class="nb">false</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">vis</span><span class="p">));</span>
82287
- <span class="w"> </span><span class="n">function </span><span class="o">< </span><span class="kt">void </span><span class="p">( </span><span class="kt">int </span><span class="p">) </span><span class="o">> ;</span><span class="w"> </span><span class="n">dfs </span><span class="w"> </span><span class="o">= </span><span class="w"> </span><span class="p">[ </span><span class="o">& </span><span class="p">]( </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
82291
+ <span class="w"> </span><span class="k">auto </span><span class="w"> </span><span class="n">dfs </span><span class="w"> </span><span class="o">= </span><span class="w"> </span><span class=" p">[ </span><span class="o">& ;</span><span class="p">]( </span><span class="k">this </span><span class="w"> </span><span class="k">auto</span><span class="o">&& </span><span class="w"> </span><span class="n">dfs </span><span class="p">, </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="kt">void </span><span class="w"> </span><span class="p">{</span>
82288
82292
<span class="w"> </span><span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
82289
82293
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">n</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
82290
82294
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">vis</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">isConnected</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
@@ -82445,7 +82449,11 @@ <h3 id="solution-1">Solution 1</h3>
82445
82449
82446
82450
<!-- solution:start -->
82447
82451
82448
- <h3 id="solution-2">Solution 2</h3>
82452
+ <h3 id="solution-2-union-find">Solution 2: Union-Find</h3>
82453
+ <p>We can also use the union-find data structure to maintain each connected component. Initially, each city belongs to a different connected component, so the number of provinces is $n$.</p>
82454
+ <p>Next, we traverse the matrix $\textit{isConnected}$. If there is a connection between two cities $(i, j)$ and they belong to two different connected components, they will be merged into one connected component, and the number of provinces is decremented by $1$.</p>
82455
+ <p>Finally, return the number of provinces.</p>
82456
+ <p>The time complexity is $O(n^2 \times \log n)$, and the space complexity is $O(n)$. Here, $n$ is the number of cities, and $\log n$ is the time complexity of path compression in the union-find data structure.</p>
82449
82457
<div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label><label for="__tabbed_2_2">Java</label><label for="__tabbed_2_3">C++</label><label for="__tabbed_2_4">Go</label><label for="__tabbed_2_5">TypeScript</label></div>
82450
82458
<div class="tabbed-content">
82451
82459
<div class="tabbed-block">
@@ -82583,7 +82591,7 @@ <h3 id="solution-2">Solution 2</h3>
82583
82591
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">isConnected</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
82584
82592
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">p</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
82585
82593
<span class="w"> </span><span class="n">iota</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
82586
- <span class="w"> </span><span class="n">function </span><span class="o">< </span><span class="kt">int </span><span class="p">( </span><span class="kt">int </span><span class="p">) </span><span class="o">> ;</span><span class="w"> </span><span class="n">find </span><span class="w"> </span><span class="o">= </span><span class="w"> </span><span class="p">[ </span><span class="o">& </span><span class="p">]( </span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span>
82594
+ <span class="w"> </span><span class="k">auto </span><span class="w"> </span><span class="n">find </span><span class="w"> </span><span class="o">= </span><span class="w"> </span><span class=" p">[ </span><span class="o">& ;</span><span class="p">]( </span><span class="k">this </span><span class="w"> </span><span class="k">auto</span><span class="o">&& </span><span class="w"> </span><span class="n">find </span><span class="p">, </span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span>
82587
82595
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
82588
82596
<span class="w"> </span><span class="n">p</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">x</span><span class="p">]);</span>
82589
82597
<span class="w"> </span><span class="p">}</span>
@@ -82686,15 +82694,9 @@ <h3 id="solution-2">Solution 2</h3>
82686
82694
<span class="normal">21</span>
82687
82695
<span class="normal">22</span>
82688
82696
<span class="normal">23</span>
82689
- <span class="normal">24</span>
82690
- <span class="normal">25</span>
82691
- <span class="normal">26</span>
82692
- <span class="normal">27</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="kd">function</span><span class="w"> </span><span class="nx">findCircleNum</span><span class="p">(</span><span class="nx">isConnected</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">[][])</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
82697
+ <span class="normal">24</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="kd">function</span><span class="w"> </span><span class="nx">findCircleNum</span><span class="p">(</span><span class="nx">isConnected</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">[][])</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
82693
82698
<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">isConnected</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
82694
- <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">p</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="nx">n</span><span class="p">);</span>
82695
- <span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nx">n</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="nx">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
82696
- <span class="w"> </span><span class="nx">p</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">i</span><span class="p">;</span>
82697
- <span class="w"> </span><span class="p">}</span>
82699
+ <span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">p</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">.</span><span class="kr">from</span><span class="p">({</span><span class="w"> </span><span class="nx">length</span><span class="o">:</span><span class="w"> </span><span class="kt">n</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="p">(</span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">i</span><span class="p">)</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="nx">i</span><span class="p">);</span>
82698
82700
<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">find</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">x</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="p">{</span>
82699
82701
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">p</span><span class="p">[</span><span class="nx">x</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
82700
82702
<span class="w"> </span><span class="nx">p</span><span class="p">[</span><span class="nx">x</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">find</span><span class="p">(</span><span class="nx">p</span><span class="p">[</span><span class="nx">x</span><span class="p">]);</span>
0 commit comments