LeetCode 1711 大餐計數 做題小結

2021-10-13 22:36:52 字數 1092 閱讀 3030

大餐 是指 恰好包含兩道不同餐品 的一餐,其美味程度之和等於 2 的冪。

你可以搭配 任意 兩道餐品做一頓大餐。

給你乙個整數陣列 deliciousness ,其中 deliciousness[i] 是第 i​​​​​​​​​​​​​​ 道餐品的美味程度,返回你可以用陣列中的餐品做出的不同 大餐 的數量。結果需要對 109 + 7 取餘。

注意,只要餐品下標不同,就可以認為是不同的餐品,即便它們的美味程度相同。

示例 1:

輸入:deliciousness = [1,3,5,7,9]

輸出:4

解釋:大餐的美味程度組合為 (1,3) 、(1,7) 、(3,5) 和 (7,9) 。

它們各自的美味程度之和分別為 4 、8 、8 和 16 ,都是 2 的冪。

示例 2:

輸入:deliciousness = [1,1,1,3,3,3,7]

輸出:15

解釋:大餐的美味程度組合為 3 種 (1,1) ,9 種 (1,3) ,和 3 種 (1,7) 。

1 <= deliciousness.length <= 105

0 <= deliciousness[i] <= 220

一. 暴力解法

顯然,此題可以通過暴力解法解決:雙層for迴圈找到所有滿足要求的兩數之和,並統計次數。時間複雜度為o(n^2), 超時。

二. 雜湊表記錄數字出現次數

通過暴力解法我們可以發現,在查詢兩數之和的第二個數時,用了o(n)時間(遍歷整個陣列)。又由於我們只關心次數,而並非具體的哪兩個數,所以我們可以用雜湊表記錄數字與其出現次數,這樣可以把查詢時間優化到o(1)。注意到此題的輸入限制,數字最大為2^20,所以我們可以在有限的空間列舉。**如下:

public int countpairs(int deliciousness) 

poweroftwo *= 2;

}map.put(num, map.getordefault(num, 0) + 1);

}return (int)answer;

}

參考:

Leetcode 1711 大餐計數

大餐 是指 恰好包含兩道不同餐品 的一餐,其美味程度之和等於 2 的冪。你可以搭配 任意 兩道餐品做一頓大餐。給你乙個整數陣列 deliciousness 其中 deliciousness i 是第 i 道餐品的美味程度,返回你可以用陣列中的餐品做出的不同 大餐 的數量。結果需要對 109 7 取餘...

Leetcode 1711 大餐計數(桶)

1711.大餐計數 難度中等83收藏分享切換為英文接收動態反饋 大餐是指恰好包含兩道不同餐品的一餐,其美味程度之和等於 2 的冪。你可以搭配任意兩道餐品做一頓大餐。給你乙個整數陣列deliciousness,其中deliciousness i 是第i道餐品的美味程度,返回你可以用陣列中的餐品做出的不...

leetcode 第三大的數

這道題我沒有去追求特別高深的解法了。給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o n 示例 1 輸入 3,2,1 輸出 1 解釋 第三大的數是 1.示例 2 輸入 1,2 輸出 2 解釋 第三大的數不存在,所以返回最大的數 2 示例 3 輸...