Java棧隊(duì)列堆算法題-00

用兩個(gè)棧實(shí)現(xiàn)隊(duì)列

用兩個(gè)棧來實(shí)現(xiàn)一個(gè)隊(duì)列,完成隊(duì)列的 Push 和 Pop 操作。

  1. 棧先入后出,隊(duì)列先進(jìn)先出。
    所以入棧一次出一次,序列相反。再入棧一次出棧一次,成序列相同。
    第一次:入1-2-3 出3-2-1
    第二次:入3-2-1 出1-2-3
   Stack<Integer> in = new  Stack<Integer>();
   out.isEmpty()
   in.push(node);
   out.push(in.pop());

https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


包含 min 函數(shù)的棧

實(shí)現(xiàn)一個(gè)包含 min() 函數(shù)的棧,該方法返回當(dāng)前棧中最小的值。

  1. 2個(gè)棧,一個(gè)直接放數(shù)據(jù)。一個(gè)進(jìn)行比較,將較小的數(shù)據(jù)放入第二個(gè)棧中去。
minStack.push(minStack.isEmpty() ? node : Math.min(minStack.peek(), node));
//感覺像固定寫法
public void pop() {
    dataStack.pop();
    minStack.pop();
}

https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


棧的壓入、彈出序列

輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。

  1. 入棧的時(shí)候比較一下是不是出棧序列的當(dāng)前值,是的話,出了,不是的話,繼續(xù)加。到最后看有沒有出完即可。
return stack.isEmpty();

https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&tqId=11174&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


最小的 K 個(gè)數(shù)

給定一個(gè)長(zhǎng)度為 n 的可能有重復(fù)值的數(shù)組,找出其中不去重的最小的 k 個(gè)數(shù)。例如數(shù)組元素是4,5,1,6,2,7,3,8這8個(gè)數(shù)字,則最小的4個(gè)數(shù)字是1,2,3,4(任意順序皆可)。
要求:空間復(fù)雜度 O(n)O(n) ,時(shí)間復(fù)雜度 O(nlogn)O(nlogn)

  1. 大小為k的最小堆
  • 構(gòu)建一個(gè)大頂堆,取大頂堆前幾位。
  • 初始化實(shí)現(xiàn)大頂堆,不設(shè)置則默認(rèn)為小頂堆。
  • PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
  • 輸出第一個(gè)數(shù),并刪除。
maxHeap.poll();

返回堆的隊(duì)列

return new ArrayList<>(maxHeap);
  1. 快排
    • 快速排序的方法,找到第K的數(shù)的位置。
    • 每執(zhí)行一次快排,某個(gè)數(shù)之前一定是小于它的,之后一定是大于它的。

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


數(shù)據(jù)流中的中位數(shù)

如何得到一個(gè)數(shù)據(jù)流中的中位數(shù)?如果從數(shù)據(jù)流中讀出奇數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后位于中間的數(shù)值。如果從數(shù)據(jù)流中讀出偶數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后中間兩個(gè)數(shù)的平均值。

  1. 大小頂堆
    • 數(shù)據(jù)流是一個(gè)串,假設(shè)排序完成,我將它分為2部分。
    • 這樣最半部分取最大值,右半部分取最小值,實(shí)現(xiàn)其平均數(shù)的結(jié)果。
    • 當(dāng)N為偶數(shù),右半邊的數(shù)要全大于左邊,所以先往左插,再插右?;鶖?shù)相反。
   left.add(val);
   right.add(left.poll());

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=11216&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


字符流中第一個(gè)不重復(fù)的字符2022.7.9-3

請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來找出字符流中第一個(gè)只出現(xiàn)一次的字符。例如,當(dāng)從字符流中只讀出前兩個(gè)字符 "go" 時(shí),第一個(gè)只出現(xiàn)一次的字符是 "g"。當(dāng)從該字符流中讀出前六個(gè)字符“google" 時(shí),第一個(gè)只出現(xiàn)一次的字符是 "l"。

  1. 隊(duì)列,我的第一個(gè)數(shù)字,一定是只出現(xiàn)一次的,且一定是第一次出現(xiàn)的。之后出現(xiàn)了第二次,就把它出了。
private int[] cnts = new int[128];
private Queue<Character> queue = new LinkedList<>();
public void Insert(char ch) {
    cnts[ch]++;
    queue.add(ch);
    while (!queue.isEmpty() && cnts[queue.peek()] > 1)
        queue.poll();
}
public char FirstAppearingOnce() {
    return queue.isEmpty() ? '#' : queue.peek();
}

https://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720?tpId=13&tqId=11207&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


滑動(dòng)窗口的最大值2022.7.9-4

給定一個(gè)數(shù)組和滑動(dòng)窗口的大小,找出所有滑動(dòng)窗口里數(shù)值的最大值。
例如,如果輸入數(shù)組 {2, 3, 4, 2, 6, 2, 5, 1} 及滑動(dòng)窗口的大小 3,那么一共存在 6 個(gè)滑動(dòng)窗口,他們的最大值分別為 {4, 4, 6, 6, 6, 5}。

  1. 堆的維護(hù),直接生成一個(gè)結(jié)果堆,然后對(duì)它進(jìn)行維護(hù)。
    可以直接刪除某個(gè)數(shù)
   heap.remove(num[i]);
   heap.add(num[j]);
   ret.add(heap.peek());

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788?tpId=13&tqId=11217&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


引用倉庫:https://github.com/CyC2018/CS-Notes/blob/master/notes/%E5%89%91%E6%8C%87%20Offer%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從尾到頭打印鏈表 從尾到頭反過來打印出每個(gè)結(jié)點(diǎn)的值。 感覺更優(yōu)-遞歸打123的逆序,先打23逆序再打1,先打3逆序...
    檸檬樹LeTr閱讀 412評(píng)論 0 0
  • 重建二叉樹 根據(jù)二叉樹的前序遍歷和中序遍歷的結(jié)果,重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的...
    檸檬樹LeTr閱讀 177評(píng)論 0 0
  • 和為 S 的兩個(gè)數(shù)字 在有序數(shù)組中找出兩個(gè)數(shù),使得和為給定的數(shù) S。如果有多對(duì)數(shù)字的和等于 S,輸出兩個(gè)數(shù)的乘積最...
    檸檬樹LeTr閱讀 519評(píng)論 0 0
  • 重復(fù)數(shù)字 在一個(gè)長(zhǎng)度為 n 的數(shù)組里的所有數(shù)字都在 0 到 n-1 的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾...
    檸檬樹LeTr閱讀 403評(píng)論 0 1
  • https://www.nowcoder.com/practice/54275ddae22f475981afa22...
    7ccc099f4608閱讀 175評(píng)論 0 0

友情鏈接更多精彩內(nèi)容