<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>In Place on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/in-place/</link><description>Recent content in In Place on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Tue, 02 Jul 2019 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/in-place/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 5 In-Place</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-5-in-place/</link><pubDate>Tue, 02 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-5-in-place/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 5 In-Place" /&gt;&lt;p&gt;&lt;strong&gt;0026. Remove Duplicates from Sorted Array (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a sorted nums array, remove the duplicates &lt;a class="link" href="https://en.wikipedia.org/wiki/In-place_algorithm" target="_blank" rel="noopener"
&gt;&lt;strong&gt;in-place&lt;/strong&gt; &lt;/a&gt; such that each element appears only &lt;em&gt;once&lt;/em&gt; and return the new length.&lt;/p&gt;
&lt;p&gt;Do not allocate extra space for another array, you must do this by &lt;strong&gt;modifying the input array&lt;/strong&gt; &lt;a class="link" href="https://en.wikipedia.org/wiki/In-place_algorithm" target="_blank" rel="noopener"
&gt;** in-place**&lt;/a&gt; with O(1) extra memory.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Given nums = [1,1,2],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;It doesn&amp;#39;t matter what you leave beyond the returned length.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Given nums = [0,0,1,1,1,2,2,3,3,4],
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;It doesn&amp;#39;t matter what values are set beyond the returned length.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目要求將一個已排序陣列中所有的重複數字刪去，使得這個陣列的每個數字只出現一次，並且必須要以in-place的方式來處理。&lt;br&gt;
最終處理過後，回傳新陣列的長度。&lt;/p&gt;
&lt;p&gt;題目其實並不困難，設定一個i用來記錄目前存放到哪個位置，&lt;br&gt;
再設定一個j用以完整遍歷整個陣列，&lt;br&gt;
每當發現有不同的數字時，就將j的數字塞到i的位置，再往下推進即可。&lt;/p&gt;
&lt;p&gt;最後由於要回傳的是新陣列的長度，所以應該要回傳i+1。(陣列由0開始)&lt;/p&gt;
&lt;p&gt;這邊要順便提到的一個名詞叫&lt;strong&gt;in-place algorithm&lt;/strong&gt; 。&lt;br&gt;
所謂的in-place，就是指所有的操作修改，除了一些計數用的變數外，&lt;br&gt;
&lt;strong&gt;基本上都在原先的資料結構內解決&lt;/strong&gt; ，像這題就是完全只有操作原陣列。&lt;br&gt;
如果沒有這樣的限制，這題也是可以使用ArrayList，每當發現一個不同的數就將其往List尾端加，最後再將其轉為array，&lt;br&gt;
同樣可以得到解，但它的空間複雜度就會變成O(N)，&lt;br&gt;
因為我們開了一組額外的記憶體來存放它。&lt;/p&gt;
&lt;p&gt;所以in-place algorithm會應用在一些&lt;strong&gt;不希望大量增加記憶體使用量&lt;/strong&gt; 的狀況，且在這個限制條件下，有時候我們不一定能像這題這樣得到跟非in-place時一樣時間複雜度的解法。&lt;br&gt;
所以&lt;strong&gt;in-place algorithm通常會有拿時間換取空間效率的狀況&lt;/strong&gt; 。&lt;br&gt;
總之，如果&lt;strong&gt;原先的資料被修改或打亂也沒關係&lt;/strong&gt; 的話，&lt;br&gt;
就有使用in-place algorithm的機會，也有可能會被面試官問到，&lt;br&gt;
但請務必謹慎地確認是否這個狀況下，&lt;br&gt;
你真的會必須用比較差的時間複雜度達到相同的目的。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/17ad6dbe70bef408aa2c3c40cb00acaf.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/b2f59727e08875fcd99cafd47189da77.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間複雜度跟空間複雜度為？」(O(N), O(1))&lt;/p&gt;
&lt;p&gt;「如果不要求in-place，改成新開list/arraylist來做會比較快嗎？」&lt;br&gt;
(不會，因為時間複雜度相同，但要額外花時間做記憶體配置)&lt;/p&gt;
&lt;p&gt;「如果題目今天給的是未排序陣列要去除duplicate，&lt;br&gt;
但不用in-place，也不用保留順序的話？」&lt;br&gt;
(使用HashMap/dict，將整個陣列掃過一遍，最後遍歷輸出)&lt;br&gt;
(時間/空間複雜度為O(N), O(N))&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>