為了實習面試準備,最近開始寫LeetCode了(雖然投的都還沒回我)。
原本打算訂個一天寫3題、5題之類的,但因為每天的時間不多發現做不到,就會幫自己找藉口當天不去寫,然後不寫的隔天又會很懊惱,進入了一個死循環,那就不如用他網站的 daily challenge 機制,每天寫個一題也好,並且將自己的想法寫下來,當作陳述的練習。
今天的題目被分在Hard,提示說要用DP,上面有做超連結可以點進去看題目。
題目的意思花了點時間才了解,簡化後的意思就是要你對給定的陣列,去算出以怎樣的順序去乘,也就是第一個乘1、第二個乘2、第三個乘3,以此類推,以及陣列選幾個元素,可以得到最大值。
以Example 1來說,[-1,-8,0,5,-9],答案是14。也就是選3個元素,並且以,-1、0、5,的順序去乘,-1*1+0*2+5*3 = 14。
因為限制非常少,特別是給的這個陣列順序可以做任意調換,讓這題其實不用DP也能解。
要得到序列的最大結果,只要最小的數最先乘,最大的數最後乘,這樣就可以得到最大結果。所以在做法上來說,先對這個陣列做排序,C++的sort預設是以遞增的方式輸出。在遞增的排序後,根據當前要選的元素數去計算結果,在不是全都要的情況下,就把前幾小的元素跳過。最後去比對最大值,然後回傳。
同樣以上面提到的Example 1為例,先對給定序列作排序,結果為,[-9,-8,-1,0,5],去計算選5個、選4個、選3個、選2個、選1個,的最大值。以選4個為例子,在計算選4個的最大值時,就把-9跳過不做計算,去算[--8,-1,0,5]。在算選3個的最大值時,就跳過-9和-8,去算[-1,0,5],剩下同理。
最後會得到選3個會是最大值,回傳選3個最大值的結果。