題目:給定乙個長度為n且"沒有重複元素"的陣列array和乙個整數m,實現函式等概論隨機列印array中的m個數。
要求:1.相同的數不要重複列印
2.時間複雜度為o(m),額外空間複雜度為o(1)
3.可以改變array陣列
解題思路:
解法的關鍵點是利用要求3改變陣列array。列印過程如下:
1.在[0, n - 1]中隨機得到乙個位置a,然後列印array[a]
2.把array[a]和array[n - 1]交換
3.在[0, n - 2]中隨機得到乙個位置b,然後列印array[b],因為列印過的arraya[a]已經被換到了
n-1位置,所以這次列印不可能再次出現。
4.把array[b]和array[n - 2]交換
5.在[0.n-3]中隨機得到乙個數c,然後列印array[c],因為列印過的array[a]和array[b]已經被換到了
n-1位置和n-2位置,所以這次列印都不可能再出現。
6.以此類推,直到列印m個數
總之,就是把隨機選出來的數列印出來,然後將列印的數交換到範圍中的最後位置,再把範圍縮小,使得被列印的數下次
不可能再被選中,直到列印結束。很多有關等概論隨機的面試題都是使用這種和最後乙個位置交換的解法。
public class randomm
m = math.max(array.length, m);
int count = 0;
int i = 0;
while(count < m)
}public void swap(int array, int index1, int index2)
}
從N個數中等概率列印M個數
題目 給定乙個長度為n且沒有重複元素的陣列arr和乙個整數n,實現函式等概率隨機列印arr中的m個數。要求 相同的數不要重複列印 時間複雜度為o m o m o m 額外空間複雜度為o 1 o 1 o 1 可以改變arr陣列。不考慮額外空間複雜度為o 1 o 1 o 1 的限制,建立乙個狀態陣列或者...
從n個數中刪除m個數
補題 題目大意是 有個很大的整數n,刪除其中的m位數字,使得剩下的數字按原來的次序組成的數最大。include include include include include include include define ll long long define inf 0x3f3f3f3f usin...
等概率無重複的從n個數中選取m個數
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!問題描述 程式的輸入包含兩個整數m和n,其中m學習過概率統計的同學應該都知道每乙個數字被抽取的概率都應該為m n.那麼我們怎麼構造出這樣的概率呢?在 程式設計珠璣 上面是這樣解析的 依次考慮整數0,1,2,n 1,並通過乙個適當的隨機測試對每個整數...