# 1103757喬伊波伊HW5 ## 1. Heap Sort ### 1-1. 下圖為Max Heap。Heap Sort的每一回合,會將Heap的最大值刪除後,又恢復為Heap。請畫出第一回合恢復的過程。 ![](https://i.imgur.com/RyvrxnT.png) 解:![](https://i.imgur.com/M5GHgCk.jpg) ### 1-2. 投影片69頁的公式如下,請解釋此公式的含意。 ![](https://i.imgur.com/RxCC5Hg.png) 解:![](https://i.imgur.com/IsAlpYo.jpg) ## 2.Problem平均的Lower Bound * ### 下圖為二元樹。參考投影片77頁,已知最高點(root)的深度為1,請算出二元樹的External Path Length,以及葉子平均深度。 ![](https://i.imgur.com/Egy4IdO.png) 解:![](https://i.imgur.com/dTgttlu.jpg) ## 3.Problem Transformation * ### Sorting problem reduces to Convex Hull Problem * ### 請說明,若要排序五個數字:4,1,3,2,5,如何轉為Convex Hull Problem後,完成排序。 解:![](https://i.imgur.com/7HLExw3.jpg) ## 4.圓型打字機[Minimum Time to Type Word Using Special Typewriter](https://leetcode.com/problems/minimum-time-to-type-word-using-special-typewriter/) * ### 解題思路: 建立一個nowword來當比較和可用ascii code來相減的變數,相減後如果大於13代表換個方向走會比較好所以26-movsec,若沒有沒事,最後在更新movesecond和nowword的data,以此類推直到迴圈的i大於等於word.size()。 * ### 程式碼: ```c99= int minTimeToType(string word) { char nowword='a'; int movesecond=0; for(int i=0;i<word.size();i++){ int a=int(nowword); int b=int(word[i]); int movesec=abs(a-b); if(movesec>13){ movesec=26-movesec; } movesecond+=(movesec+1); nowword=word[i]; } return movesecond; } ``` * ### 畫面截圖: ![](https://i.imgur.com/iX6PmrR.png) * ### 花費的時間:30min * ### 完成比例:看老師下面給的提示 ## 5.跳到最後[Jump Game](https://leetcode.com/problems/jump-game/) * ### 解題思路: 建立一個temp變數,存index+nums[index]和temp的最大值,在比較看是否temp<i如果是的話就return false,否則迴圈繼續執行到結束後return true。 * ### 程式碼: ```cpp= bool canJump(vector<int>& nums) { int temp=0; for(int i=0;i<nums.size();i++){ if(temp<i)return false; temp=max(i+nums[i],temp); } return true; } ``` * ### 畫面截圖: ![](https://i.imgur.com/B30Rw6a.png) * ### 花費的時間:30min * ### 完成比例:有看solution ## 6.由各行的和與各列的和求矩陣[Find Valid Matrix Given Row and Column Sums](https://leetcode.com/problems/find-valid-matrix-given-row-and-column-sums/) * ### 解題思路: 這題完全想不到怎麼寫,只能看solution裡面最容易理解的來參考,這參考的解法是先用迴圈中的迴圈,然後看rowsum[i]有沒有比colsum[j]小,有的話做一些讓我看很久的value update,沒有的話做跟上面差不多的value update,但看了很久還是沒有很了解,希望老師上課可以詳細講解。 * ### 程式碼: ```cpp= vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) { int r=rowSum.size(); int c=colSum.size(); vector<vector<int>> a(r, vector<int> (c,0)); for(int i=0; i<r; i++){ for(int j=0; j<c; j++){ if(rowSum[i]<colSum[j]){ a[i][j]=rowSum[i]; colSum[j]=colSum[j]-rowSum[i]; rowSum[i]=0; } else{ a[i][j]=colSum[j]; rowSum[i]=rowSum[i]-colSum[j]; colSum[j]=0; } } } return a; } ``` * ### 畫面截圖: ![](https://i.imgur.com/9C0kmyK.png) * ### 花費的時間:50min * ### 完成比例:有看solution ## 7.本週心得: 這星期的作業程式題是,上演算法以來最難的一次,有些看solution還不太了解為什麼要這樣做,感覺有點再背公式的感覺,希望老師下次上課可以詳細講解和分解解題過程,因為如過這樣用背的沒有完全了解它背後的詳細解法,程式能力就無法進步,再麻煩老師了,謝謝!