Java?C++題解?leetcode第k個數(shù)實例
更新時間:2022年09月29日 15:19:29 作者:AnjaVon
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個數(shù)實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
題目要求
思路一:小根堆
- 中文題目描述不太清晰,但其實由題目可以發(fā)現(xiàn),當(dāng)x滿足條件時,3x、5x、7x分別也都滿足條件。
- 將滿足條件的數(shù)依次放入優(yōu)先隊列存放用于后續(xù)計算,由于每次要取待計算隊列中最小的數(shù)x,所以定義小根堆:
- 彈出x,計算3x、5x、7x并入隊;
- 用一個哈希表記錄防止重復(fù)入隊。
- 每次取數(shù)(
pop
)時進行計數(shù),到第k次結(jié)束,當(dāng)前隊首即為答案。
Java
- 《學(xué)到了》
1L
也就是long
型的數(shù)字1,那么同理1f
就是float
型,本質(zhì)上都是相等的1。- 還有區(qū)分
Long
型和long
型,前者是包裝類,有函數(shù)可以調(diào)用。
class Solution { public int getKthMagicNumber(int k) { int[] nums = new int[]{3, 5, 7}; PriorityQueue<Long> que = new PriorityQueue<>(); Set<Long> set = new HashSet<>(); que.add(1L); set.add(1L); while (!que.isEmpty()) { long cur = que.poll(); if (--k == 0) return (int) cur; for (int x : nums) { // 3、5、7依次 if (!set.contains(x * cur)) { que.add(x * cur); set.add(x * cur); } } } return -1; } }
C++
class Solution { public: int getKthMagicNumber(int k) { int nums[3] = {3, 5, 7}; priority_queue<long, vector<long>, greater<long>> que; // 小根堆 unordered_set<long> set; que.push(1L); set.insert(1L); while (!que.empty()) { long cur = que.top(); que.pop(); if (--k == 0) return (int)cur; for (auto x : nums) { // 3、5、7依次 if (!set.count(x * cur)) { que.push(x * cur); set.insert(x * cur); } } } return -1; } };
思路二:多路歸并【多指針】
Java
class Solution { public int getKthMagicNumber(int k) { int[] res = new int[k + 1]; res[1] = 1; for (int i3 = 1, i5 = 1, i7 = 1, idx = 2; idx <= k; idx++) { int r3 = res[i3] * 3, r5 = res[i5] * 5, r7 = res[i7] * 7; res[idx] = Math.min(r3, Math.min(r5, r7)); if (res[idx] == r3) i3++; if (res[idx] == r5) i5++; if (res[idx] == r7) i7++; } return res[k]; } }
- 時間復(fù)雜度:O(k)
- 空間復(fù)雜度:O(k)
C++
class Solution { public: int getKthMagicNumber(int k) { int res[k + 1]; res[1] = 1; for (int i3 = 1, i5 = 1, i7 = 1, idx = 2; idx <= k; idx++) { int r3 = res[i3] * 3, r5 = res[i5] * 5, r7 = res[i7] * 7; res[idx] = min(r3, min(r5, r7)); if (res[idx] == r3) i3++; if (res[idx] == r5) i5++; if (res[idx] == r7) i7++; } return res[k]; } };
- 時間復(fù)雜度:O(k)
- 空間復(fù)雜度:O(k)
Rust
impl Solution { pub fn get_kth_magic_number(k: i32) -> i32 { let mut res = vec![0; (k + 1) as usize]; res[1] = 1; let (mut i3, mut i5, mut i7) = (1, 1, 1); for idx in 2..(k + 1) as usize { let (r3, r5, r7) = (res[i3] * 3, res[i5] * 5, res[i7] * 7); res[idx] = r3.min(r5.min(r7)); if (res[idx] == r3) { i3 += 1; } if (res[idx] == r5) { i5 += 1; } if (res[idx] == r7) { i7 += 1; } } res[k as usize] } }
- 時間復(fù)雜度:O(k)
- 空間復(fù)雜度:O(k)
總結(jié)
偷懶就不寫rust
的優(yōu)先隊列了……
是“丑數(shù)”的變種題目,題目描述有點問題(力扣日常、去看原文好理解很多),做過就會技巧性并不太強的題目~
以上就是Java C++題解 leetcode第k個數(shù)實例的詳細內(nèi)容,更多關(guān)于Java C++題解第k個數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenCV提取圖像中圓線上的數(shù)據(jù)具體流程
在對圖像進行處理時,經(jīng)常會要提取出圖像中某條直線、圓線或者ROI區(qū)域內(nèi)的感興趣數(shù)據(jù),進行重點關(guān)注。本文主要介紹了利用OpenCV獲取圖像中圓線上的數(shù)據(jù),需要的可以參考一下2021-11-11C語言使用stdlib.h庫函數(shù)的二分查找和快速排序的實現(xiàn)代碼
以下是對C語言使用stdlib.h庫函數(shù)的二分查找和快速排序的實現(xiàn)代碼進行了詳細的介紹,需要的朋友可以過來參考下。希望對大家有所幫助2013-10-10你只用do-while來實現(xiàn)循環(huán)?太浪費了
這篇文章主要介紹了你只用do-while來實現(xiàn)循環(huán)?太浪費了,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12