題目:https://leetcode.com/problems/last-stone-weight/
描述:輸入許多石頭對應的重量,每次拿重量最重的2顆石頭互砸會剩下重量相減後的一顆石頭,算出最後剩的一顆石頭的重量,石頭沒有剩則回傳0
解題思路:要有效率的找出最大的2顆石頭可以使用排序,但是每次2顆最大的石頭砸完後還是得要把新的石頭排到對應的位置,這樣的時間複雜度會是(每次砸完重新排序的)O(nlogn)
乘上(一共要砸的次數)O(n)
的O(n^2logn)
因此我們改用更快的heap,heap插入新元素的時間複雜度為O(logn)
,取出最大值為O(1)
,每次取出石頭砸完再將剩的石頭放回去heap,時間複雜度就能降為(每次砸完放回去的)O(logn)
乘上(一共要砸的次數)O(n)
的O(nlogn)
程式碼:
class Solution {
public int lastStoneWeight(int[] stones) {
//outputs largest number
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(Collections.reverseOrder());
for(int stone : stones) {
queue.offer(stone);
}
while(queue.peek() != null) {
int bigStone = queue.poll();
if(queue.peek() == null) return bigStone;
int smallStone = queue.poll();
queue.offer(bigStone - smallStone);
}
return 0;
}
}
時間複雜度:O(nlogn)
空間複雜度:O(n)
leetcode
easy
heap
題目:https://leetcode.com/problems/power-of-four/description/ 描述:判斷輸入的數字是否為4的次方數 解題思路:標準解法是使用對數基底變換方法,不過這題也可以看作判斷是否為2的次方數的延伸題,4的次方數跟2的次方數一樣用二進位制表示只會有1個位元為1,不過這次這些1只會出現在奇數位上,額外再用一個mask來判斷1是否出現在奇數位即可 程式碼: class Solution { public boolean isPowerOfFour(int n) {
Dec 7, 2022題目:https://leetcode.com/problems/power-of-three/description/ 描述:判斷輸入的數字是否為3的次方數 解題思路(1):用對數的基底變換計算,如果i = log10(n) / log10(3)的i為整數的話代表n為3的次方數 程式碼: class Solution { public boolean isPowerOfThree(int n) {
Dec 7, 2022題目:https://leetcode.com/problems/power-of-two/description/ 描述:判斷輸入的數字是否是2的n次方數 解題思路:有個方法能快速找出正整數n是否為2的n次方數/只有一個位元為1:將n與n-1進行位元AND運算,結果為0則n即為2的n次方數/只有一個位元為1 程式碼: class Solution { public boolean isPowerOfTwo(int n) {
Dec 6, 2022題目:https://leetcode.com/problems/reverse-bits/ 描述:將32位元的unsigned int中的位元順序顛倒後回傳結果的值 解題思路:詳細解答來源,用分治法(divide and conquer)每次將處理範圍中左半與右半邊的位元值互換,對一個有2^n位元的數字總共只需要換n次即可 程式碼: public class Solution { // you need treat n as an unsigned value
Nov 30, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up