大餐 是指 恰好包含兩道不同餐品 的一餐,其美味程度之和等於 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 輸...