Leetcode 295.數據流的中位數

295.數據流的中位數

問題描述

中位數是有序整數列表中的中間值。如果列表的大小是偶數,則沒有中間值,中位數是兩個中間值的平均值。

  • 例如 arr = [2,3,4] 的中位數是 3
  • 例如 arr = [2,3] 的中位數是 (2 + 3) / 2 = 2.5

實現 MedianFinder 類:

  • MedianFinder() 初始化 MedianFinder 對象。
  • void addNum(int num) 將數據流中的整數 num 添加到數據結構中。
  • double findMedian() 返回到目前為止所有元素的中位數。與實際答案相差 10-5 以內的答案將被接受。

示例 1:

輸入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
輸出
[null, null, null, 1.5, null, 2.0]解釋
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

  • -105 <= num <= 105
  • 在調用 findMedian 之前,數據結構中至少有一個元素
  • 最多 5 * 104 次調用 addNumfindMedian

解題思路與代碼實現

思路:

設置兩個優先隊列(相當于堆)queMinqueMax

queMin:記錄小于等于中位數的數;

queMax:記錄大于中位數的數

添加元素時維持: queMax元素個數 <=queMin的元素個數 <=queMax元素個數 +1

取中位數時:

  • queMax元素個數 ==queMin的元素個數,從queMinqueMax 取出二者隊頭元素的平均值;
  • queMax元素個數 <queMin的元素個數,從queMin取出隊頭元素;

代碼實現:

class MedianFinder {PriorityQueue<Integer> queMin; // 記錄小于等于中位數的數PriorityQueue<Integer> queMax; // 記錄大于中位數的數public MedianFinder() {queMin = new PriorityQueue<>(Comparator.reverseOrder()); // 降序排序queMax = new PriorityQueue<>(Comparator.naturalOrder()); // 升序排序}/*** 添加元素時保持:* queMin的元素個數 >= queMax元素個數 && queMin的元素個數 <= queMax元素個數 + 1*/public void addNum(int num) {if (queMin.isEmpty() || queMin.peek() >= num) { // 第一個元素或者num小于等于queMin最大元素queMin.offer(num);// 盡可能保持兩者元素數量相等if (queMin.size() > queMax.size() + 1) {queMax.offer(queMin.poll());}} else { // num大于queMax最小元素queMax.offer(num);// 盡可能保持兩者元素數量相等if (queMax.size() > queMin.size()) {queMin.offer(queMax.poll());}}}public double findMedian() {if (queMin.size() > queMax.size()) {return queMin.peek();}return (queMin.peek() + queMax.peek()) / 2.0;}
}

155. 最小棧

問題描述

設計一個支持 pushpoptop 操作,并能在常數時間內檢索到最小元素的棧。

實現 MinStack 類:

  • MinStack() 初始化堆棧對象。
  • void push(int val) 將元素val推入堆棧。
  • void pop() 刪除堆棧頂部的元素。
  • int top() 獲取堆棧頂部的元素。
  • int getMin() 獲取堆棧中的最小元素。

示例 1:

輸入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]輸出:
[null,null,null,null,-3,null,0,-2]解釋:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作總是在 非空棧 上調用
  • push, pop, top, and getMin最多被調用 3 * 104

解題思路與代碼實現

思路:

設置輔助棧,棧中元素為長度為2的數組,分別存當前插入的val值和它插入后棧中的最小val值。

插入元素時:直接放在棧頂

  • 當前棧為空時,當前插入的val值就是插入后棧中的最小val值;
  • 當前棧為不空時,插入后棧中的最小val值要么是當前插入的val值,要么是插入前棧中的最小val值;

取出最小元素:從棧頂元素獲取當前棧中的最小val值;

代碼實現:

class MinStack {// 棧中元素為長度為2的數組,分別存當前插入的val值和它插入后棧中的最小val值Stack<int[]> stack = null;public MinStack() {stack = new Stack<>();}public void push(int val) {if (stack.isEmpty()) { // 當前堆棧為空stack.push(new int[] { val, val });} else { // 堆棧不為空int[] item = stack.peek();stack.push(new int[] { val, Math.min(item[1], val) });}}// 棧頂元素出棧public void pop() {stack.pop();}public int top() {int[] item = stack.peek();return item[0];}// 獲取堆棧中的最小元素public int getMin() {int[] item = stack.peek();return item[1];}
}

踩坑點

棧頂元素需要記錄當前棧中最小的val值

37. 解數獨

問題描述

編寫一個程序,通過填充空格來解決數獨問題。

數獨的解法需 遵循如下規則

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。(請參考示例圖)

數獨部分空格內已填入了數字,空白格用 '.' 表示。

示例 1:

img

輸入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
輸出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解釋:輸入的數獨如上圖所示,唯一有效的解決方案如下所示:

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位數字或者 '.'
  • 題目數據 保證 輸入數獨僅有一個解

解題思路與代碼實現

思路:

回溯暴力解,給回溯函數設置返回值,當找到一個可行解時,停止計算,返回結果。

代碼實現:

class Solution {private final int N = 9;public void solveSudoku(char[][] board) {backtracking(board, 0, 0);}/*** 回溯函數* 設置返回值是為了當找到一個可行解時,停止計算,返回結果** @return flag 是否找到了唯一的解*/private boolean backtracking(char[][] board, int row, int col) {if (row == N) { // 遍歷了整個棋盤返回truereturn true;}// 當前位置已有數字,去處理下一位置if (board[row][col] != '.') {int nextRow = col == N - 1 ? row + 1 : row;int nextCol = col == N - 1 ? 0 : col + 1;boolean flag = backtracking(board, nextRow, nextCol);return flag;}for (char k = '1'; k <= '9'; k++) {// 用1-9在當前位置嘗試if (isValid(board, row, col, k)) {board[row][col] = k;int nextRow = col == N - 1 ? row + 1 : row;int nextCol = col == N - 1 ? 0 : col + 1;boolean flag = backtracking(board, nextRow, nextCol);if (flag) { // 找到了可行解,停止計算return true;}board[row][col] = '.'; // 回溯}}// 用1-9在當前位置都不滿足,返回falsereturn false;}/*** 判斷當前位置是否有效*/private boolean isValid(char[][] board, int row, int col, char c) {// 判斷同一行或者同一列是否有重復數字for (int i = 0; i < N; i++) {if (c == board[row][i] // 同一行|| c == board[i][col]) { // 同一列return false;}}// 判斷3*3區域是否有重復數字int startX = row / 3 * 3;int startY = col / 3 * 3;for (int i = startX; i < startX + 3; i++) {for (int j = startY; j < startY + 3; j++) {if (c == board[i][j]) {return false;}}}return true;}}

踩坑點

判斷當前位置試探的數字在所在的3*3棋盤是否重復

71.簡化路徑

問題描述

給你一個字符串 path ,表示指向某一文件或目錄的 Unix 風格 絕對路徑 (以 '/' 開頭),請你將其轉化為更加簡潔的規范路徑。

在 Unix 風格的文件系統中,一個點(.)表示當前目錄本身;此外,兩個點 (..) 表示將目錄切換到上一級(指向父目錄);兩者都可以是復雜相對路徑的組成部分。任意多個連續的斜杠(即,'//')都被視為單個斜杠 '/' 。 對于此問題,任何其他格式的點(例如,'...')均被視為文件/目錄名稱。

請注意,返回的 規范路徑 必須遵循下述格式:

  • 始終以斜杠 '/' 開頭。
  • 兩個目錄名之間必須只有一個斜杠 '/'
  • 最后一個目錄名(如果存在)不能'/' 結尾。
  • 此外,路徑僅包含從根目錄到目標文件或目錄的路徑上的目錄(即,不含 '.''..')。

返回簡化后得到的 規范路徑

示例 1:

輸入:path = "/home/"
輸出:"/home"
解釋:注意,最后一個目錄名后面沒有斜杠。 

示例 2:

輸入:path = "/../"
輸出:"/"
解釋:從根目錄向上一級是不可行的,因為根目錄是你可以到達的最高級。

示例 3:

輸入:path = "/home//foo/"
輸出:"/home/foo"
解釋:在規范路徑中,多個連續斜杠需要用一個斜杠替換。

示例 4:

輸入:path = "/a/./b/../../c/"
輸出:"/c"

提示:

  • 1 <= path.length <= 3000
  • path 由英文字母,數字,'.''/''_' 組成。
  • path 是一個有效的 Unix 風格絕對路徑。

解題思路與代碼實現

思路:

使用輔助棧求解,先對字符串先切片,遍歷字符串數組判斷:

  • 如果不是空串且不是".“且不是”…",加入到棧;
  • 如果是".",跳過,不作任何處理;
  • 如果是"…"且棧不為空,彈出棧頂元素;

最后拼接棧中字符串返回。

代碼實現:

class Solution {public String simplifyPath(String path) {String[] strs = path.split("/"); // 字符串切片Stack<String> stack = new Stack<>(); // 輔助棧for (String str : strs) {// 切片后:當前字符串不為空串也不為.和..,加入到棧中if (!str.equals("") && !str.equals(".") && !str.equals("..")) {stack.push(str);} else if (str.equals("..") && !stack.isEmpty()) {// 當前字符串為..且棧中不為空,則彈出棧頂元素stack.pop();}}if (stack.isEmpty()) { // 棧為空,返回根目錄return "/";}// 拼接棧中字符串StringBuilder builder = new StringBuilder();while (!stack.isEmpty()) {builder.insert(0, "/" + stack.pop());}return builder.toString();}
}

踩坑點

沒想到字符串切片,純指針實現切片,代碼臃腫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43110.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法013:水果成籃

水果成籃. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 這道題題目很長&#xff0c;仔細閱讀過后&#xff0c;我們其實可以簡化成&#xff…

MySQL 9.0新特性:向量存儲

MySQL 9.0 正式版已經發布&#xff0c;其中一個亮點就是向量&#xff08;VECTOR&#xff09;數據類型的支持&#xff0c;本文給大家詳細介紹一下這個新功能。 向量類型 MySQL 9.0 增加了一個新的向量數據類型&#xff1a;VECTOR。它是一種可以存儲 N 個數據項的數據結構&…

Redis Stream:實時數據流的處理與存儲

Redis Stream:實時數據流的處理與存儲 引言 在當今數據驅動的世界中,實時數據處理和存儲成為了許多應用的核心需求。Redis Stream作為一種新興的數據結構,為Redis帶來了強大的流處理能力。本文將深入探討Redis Stream的特點、使用場景以及如何高效地利用它來處理實時數據流…

聚焦數字創新,定義影像未來

國際數字影像產業園在明確產業定位與發展方向時&#xff0c;應聚焦于數字影像、文創、媒體等新興產業領域&#xff0c;以技術創新為核心動力、產業升級為保障、市場拓展為途徑、國際化發展為方向&#xff0c;推動園區的持續健康發展。 作為園區的核心產業&#xff0c;數字影像產…

python socks5代理的使用

需要安裝依賴 1、解決方法1 In order to make requests use socks proxy, you need to install it with it’s dependency. pip install requests[socks]2、解決方法2 pip install PySocks

第二證券股市知識:股票填權是怎么回事?利好還是利空?

1、股票填權的含義 股票填權是指在除權除息之后的一段時刻內&#xff0c;假設多數投資者看好該個股&#xff0c;股票的價格超過除權除息的基準價就叫做填權。上市公司假設能持續分紅&#xff0c;就會向市場傳遞積極信號&#xff0c;招引更多投資者買入&#xff0c;越來越多的投…

使用Livox-Mid360激光雷達,復現FAST_LIO(保姆級教程)

前面我已經完成了mid360激光雷達的驅動安裝&#xff0c;octomap的復現&#xff0c;昨天我去把這倆在正式環境中實測了一下&#xff0c;效果不好&#xff0c;走廊轉角沒建出來&#xff0c;我查了一下&#xff0c;應該是TF的原因&#xff0c;但這部分我還不太懂&#xff0c;看到有…

云計算【第一階段(28)】DNS域名解析服務

一、DNS解析的定義與作用 1.1、DNS解析的定義 DNS解析&#xff08;Domain Name System Resolution&#xff09;是互聯網服務中的一個核心環節&#xff0c;它負責將用戶容易記住的域名轉換成網絡設備能夠識別和使用的IP地址。一般來講域名比 IP 地址更加的有含義、也更容易記住…

2024世界人工智能大會:deepin引領AI與操作系統融合新時代

內容來源&#xff1a;deepin&#xff08;深度&#xff09;社區 7月4日&#xff0c;WAIC 2024在上海拉開帷幕。大會圍繞核心技術、智能終端、應用賦能三大板塊&#xff0c;聚焦大模型、算力、機器人、自動駕駛等重點領域&#xff0c;集中展示一批“人工智能”創新應用最新成果。…

【web前端HTML+CSS+JS】--- JS學習筆記03

一、JS介紹 可以在前端頁面上進行邏輯處理&#xff0c;來解決表單的驗證等問題&#xff0c;提升效率&#xff0c;直接在前端提示問題&#xff0c;減少服務器壓力 應用1&#xff1a;可以做靜態驗證和動態驗證&#xff08;進行異步請求&#xff09; 應用2&#xff1a;可以解析后…

monad理解

每個學習monad的人都要寫一份自己理解的monad。然后還是包括自己沒人能看到自己在寫啥&#xff0c;而且大部分寫的還是錯誤的。 距離學習monad有接近2周了&#xff0c;已經挺模糊了。 monad我理解有兩個基本作用&#xff1a; 1. 能夠對全部的返回值做鏈式調用。只能封裝成mona…

學習數據庫2

在數據庫中創建一個表student&#xff0c;用于存儲學生信息 查看建表結果 向student表中添加一條新記錄 記錄中id字段的值為1&#xff0c;name字段的值為"monkey"&#xff0c;grade字段的值為98.5 并查看結果 向student表中添加多條新記錄 2,"bob"…

鴻蒙開發小案例(名片管理))

鴻蒙開發小案例&#xff08;名片管理&#xff09; 1、頁面效果1.1 初始頁面1.2 點擊名片展開1.3 點擊收藏1.4 點擊編輯按鈕 2、實現代碼2.1 DataModel.ets2.2 RandomUtil.ets2.3 ContactList.ets 1、頁面效果 1.1 初始頁面 1.2 點擊名片展開 1.3 點擊收藏 1.4 點擊編輯按鈕 2、…

百度、谷歌、必應收錄個人博客網站

主要是給各個搜索引擎提交你的sitemap文件&#xff0c;讓別人能搜到你博客的內容。 主題使用的Butterfly。 生成sitemap 安裝自動生成sitemap插件。 npm install hexo-generator-sitemap --save npm install hexo-generator-baidu-sitemap --save在站點配置文件_config.yml…

【手撕數據結構】卸甲時/空間復雜度

目錄 前言時間復雜度概念?O的漸進表?法小試牛刀 空間復雜度 前言 要想知道什么是空/時間復雜度,就得知道什么是數據結構。 這得分兩層來理解。我們生活中處處存在數據&#xff0c;什么抖音熱點上的國際大事&#xff0c;什么懂的都懂的雍正卸甲等等一系列我們用戶看得到的&a…

鴻蒙語言基礎類庫:【@ohos.url (URL字符串解析)】

URL字符串解析 說明&#xff1a; 本模塊首批接口從API version 7開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。 導入…

【K8s】專題六(5):Kubernetes 穩定性之重啟策略、滾動更新策略

以下內容均來自個人筆記并重新梳理&#xff0c;如有錯誤歡迎指正&#xff01;如果對您有幫助&#xff0c;煩請點贊、關注、轉發&#xff01;歡迎掃碼關注個人公眾號&#xff01; 目錄 一、重啟策略 1、基本介紹 2、資源清單&#xff08;示例&#xff09; 二、滾動更新策略 …

Vue框架引入

vue簡介 1.1.vue是什么?Vue官網 英文官網: https://vuejs.org/中文官網: https://cn.vuejs.org/ vue是一套構建用戶界面的漸進式javascript框架 構建用戶界面:將我們手里拿到的數據通過某種辦法變成用戶可以看見的界面前端工程師的職責:就是在合適的時候發出合適的請求,然后…

展開說說:Android服務之bindService解析

前面兩篇文章我們分別總結了Android四種Service的基本使用以及源碼層面總結一下startService的執行過程&#xff0c;本篇繼續從源碼層面總結bindService的執行過程。 本文依然按著是什么&#xff1f;有什么&#xff1f;怎么用&#xff1f;啥原理&#xff1f;的步驟來分析。 b…

Splunk Enterprise 任意文件讀取漏洞(CVE-2024-36991)

文章目錄 前言漏洞描述影響版本漏洞復現POC批量檢測-nuclei腳本 修復建議 前言 Splunk Enterprise 是一款強大的機器數據管理和分析平臺&#xff0c;能夠實時收集、索引、搜索、分析和可視化來自各種數據源的日志和數據&#xff0c;幫助企業提升運營效率、增強安全性和優化業務…