打表法經典2題 小於n的質數和第k個醜數

2021-07-03 16:24:27 字數 1068 閱讀 3686

1 求小於n的所有質數

1 開乙個大小為n的bool陣列a,下標代表整數,值true代表被mark過,有因子,非素數

2) i 從 2開始到n - 1,如果a[i]沒被mark,a[i]就是質數,然後mark有a[i]因子的數(2* a[i], 3*a[i], 4*a[i] 且< n) 這裡注意,係數實際不需要從2開始,而是從a[i]開始,即從a[i] *a[i] 看起,因為更小的數之前check 過了。

public int countprimes(int n) 

} return count;

}

2 求前k個醜數(因子裡只有2,3,5的數,習慣上1作為第乙個醜數,所以1, 2,3,4,5都是醜數)

開乙個因子陣列a{2,3, 5}和乙個前k個醜數的動態陣列v,初始化為{1,2,3,4,5}

不斷加進新的醜數,直到v的size 達到k,,v.back() 就是答案。

得到下乙個醜數的做法就是列舉3個因子{2,3,5}和已找到的醜數的乘積,對於乙個因子a[i],a[i]*v[j] 第一次大於 v.back()就break,  這個數是下乙個醜數的乙個可能的candidate,換下乙個因子,同樣的邏輯。下乙個醜數是每個因子的candidate中最小的那乙個。

這裡需要優化一下的是,對於每個因子紀錄乙個剛超過b.back()對應的醜數陣列中相乘的那個數的下標,每次找candidate的時候不是位置0開始,而是從這個位置開始

long long kthprimenumber(int k) , t = ;

vectorv =

if (k <= v.size()) return v[k - 1];

while (v.size() < k) }}

v.push_back(x);

}return v.back();

}

醜數問題也可以用堆,類似楊氏矩陣求第k小,即,每得到下乙個醜數,把這個數和 相乘的結果加進堆,只不過這個堆要支援去重,所以實際用set 做

這一類問題的特點:從小到大輸出序列,每輸出乙個值,把和這個值相鄰的序列值放入堆。

資料結構和演算法經典100題 第27題

已知一棵二叉樹的每個節點的值都不同,給定這個二叉樹的先序和中序遍歷陣列,不要重建整棵二叉樹,而知通過給定的陣列直接生成正確的後序陣列。include include include include using namespace std int setpos int prearray,int pre...

資料結構和演算法經典100題 第28題

題目要求 表示一棵二叉樹中序遍歷結果,1.求有多少種可能的二叉樹結構?2.返回所有可能的二叉樹結構的頭結點?題目解析 1.乙個關鍵點是 中序遍歷一棵二叉樹結果有序無重複,那麼這棵二叉樹必然是搜尋二叉樹。根據搜尋二叉樹的性質,結點1一定沒有左子樹,所以結點1為頭結點可能的二叉樹結構數目取決於其右子樹的...

資料結構和演算法經典100題 第29題

題目要求 二叉樹節點間的最大距離問題從二叉樹的節點a出發,可以向上走或者向下走,但沿途的節點只能經過一次,當達到節點b時,路徑上的節點數叫作a到b的距離。比如 1 2 3 4 5 6 7節點4和節點2的距離為2,節點5和節點6的距離為5。現在給定一棵二叉樹的頭結點,求整棵二叉樹上節點間的最大距離。題...