Leetcode 378-有序矩陣中第 K 小的元素

給你一個 n x n 矩陣 matrix ,其中每行和每列元素均按升序排序,找到矩陣中第 k 小的元素。
請注意,它是 排序后 的第 k 小元素,而不是第 k 個 不同 的元素。

你必須找到一個內存復雜度優于 O(n2) 的解決方案。

示例 1:

輸入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
輸出:13
解釋:矩陣中的元素為 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13
示例 2:

輸入:matrix = [[-5]], k = 1
輸出:-5

提示:

n == matrix.length
n == matrix[i].length
1 <= n <= 300
-109 <= matrix[i][j] <= 109
題目數據 保證 matrix 中的所有行和列都按 非遞減順序 排列
1 <= k <= n2

題解

有序 + 確定范圍 可以使用二分查找

  1. 左上角matrix[0][0]是下限,右下角matrix[n-1][n-1]是上限,就有了一個值,第 k 小的元素在這個值域中
    我們對值域進行二分查找(mid=(matrix[0][0]+matrix[n-1][n-1])/2),使得mid逼近值域中的目標值(第 k 小的元素)
  2. 求出矩陣里小于等于mid的有幾個,num個
  3. num 和 k 比較
    如果比 k 小,說明中間值小了,調整值域范圍(left=mid+1)
    否則,說明中間值大了,調整值域范圍(right=mid),一步步鎖定目標值

注:

1. 為什么對值二分而不是對索引二分

二分查找可以根據索引二分,也可以根據數值二分,有序數組中,索引的大小可以反映值的大小,對索引二分就行
但這里不是有序的一維數組,索引不能體現值誰大誰小,無法通過二分索引逼近目標值

2. 為什么最后left是第k小的數||二分法如何保證最后的left or right 是數組中的元素?

因為每次值域收縮都保證了第 k 小的數在 left ~ right 之間,當 left==right 時,第 k 小的數即被找出,等于left

class Solution {public int kthSmallest(int[][] matrix, int k) {int n = matrix.length;//left和right是矩陣值不是矩陣下標int left = matrix[0][0];int right = matrix[n - 1][n - 1];//一步步收縮值域范圍直至left==right//因為每次值域收縮都保證了第 k 小的數在 left ~ right 之間,當 left==right 時,第 k 小的數即被找出,等于leftwhile (left < right) {//避免溢出int mid = left + (right - left)/2;//滿足 num >= k,范圍太大,移動right至mid, 范圍收縮//注意num=k時說明小于等于mid數的數量等于k,但不代表mid就是結果,因為此時mid不一定在matrix中if (check(matrix, mid, k, n)) {right = mid;} else {//滿足 num < k,范圍太小,移動left至mid+1, 范圍收縮left = mid + 1;}}//跳出循環時left=right,返回值left是什么???return left;}//從矩陣左下角開始按列遍歷每一列,計算每一列中比mid小的元素個數并累加獲得num,將num與k比較//返回值boolean:矩陣中小于mid的數>=k//為什么不直接返回num=k時的mid值?因為mid是通過值域二分法計算出的值,不是實際的矩陣值public boolean check(int[][] matrix, int mid, int k, int n) {int i = n - 1;int j = 0;int num = 0;while (i >= 0 && j < n) {if (matrix[i][j] <= mid) {//當前元素小于mid,則本列此元素及上方元素均小于mid,num+=i+1(行號是i,行的數目是i+1)num += i + 1;//列向右移動,計算下一列小于mid的元素的個數j++;} else {//當前元素大于mid,則向上移動,直到找到比mid小的值,或者出矩陣i--;}}return num>=k;}}

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

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

相關文章

【二.提示詞工程與實戰應用篇】【3.Prompt調優:讓AI更懂你的需求】

最近老張在朋友圈秀出用AI生成的國風水墨畫,隔壁王姐用AI寫了份驚艷全場的年終總結,就連樓下小賣部老板都在用AI生成營銷文案。你看著自己跟AI對話時滿屏的"我不太明白您的意思",是不是懷疑自己買了臺假電腦?別慌,這可能是你的打開方式不對。今天咱們就聊聊這個…

UNIAPP前端配合thinkphp5后端通過高德API獲取當前城市天氣預報

如何通過 UniApp 前端項目與 ThinkPHP5 后端結合高德天氣 API 獲取天氣預報信息。我們將分為前端和后端兩部分進行實現。以下是一個完整的代碼. 一、項目結構 project/ ├── frontend/ (UniApp 項目) │ ├── pages/ │ │ └── weather/ │ │ ├── in…

藍橋杯C組真題——巧克力

題目如下 思路 代碼及解析如下 謝謝觀看

CSDN博客寫作教學(五):從寫作到個人IP的體系化構建(完結篇)

導語 (第一篇)Markdown編輯器基礎 (第二篇)Markdown核心語法 (第三篇)文章結構化思維 (第四篇)標題優化與SEO實戰 通過前四篇教程,你已掌握技術寫作的“術”——排版、標題、流量與數據。但真正的價值在于將技能升維為“道”:用技術博客為支點,撬動個人品牌與職業發…

Elasticsearch簡單學習

1、依賴的導入 <!--ES依賴--> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>2、客戶端鏈接 RestHighLevelClient client new RestHigh…

macOS Sequoia 15.3 M3 Pro芯片 iOS 開發環境配置記錄(最新)

進行如下工作之前首先確保終端已翻墻&#xff0c;在ClashX選擇“復制終端代理命令”&#xff0c;在終端進行粘附并執行。 安裝 homebrew Homebrew 是 Mac 平臺的一個包管理工具&#xff0c;提供了許多Mac下沒有的Linux工具等。 /bin/bash -c "$(curl -fsSL https://raw…

迷你世界腳本組隊接口:Team

組隊接口&#xff1a;Team 彼得兔 更新時間: 2023-04-26 10:19:04 具體函數名及描述如下: 序號 函數名 函數描述 1 getNumTeam(...) 當前隊伍數量 2 getTeamPlayerNum(...) 獲取指定隊伍玩家數量 3 getTeamPlayers(...) 獲取指定隊伍玩家 4 random…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和視頻都在說&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;畢竟那都是別人說的&#xff0c;只有自己嘗試一次才知道結果。 具體操作 第一步&#xff1a;訪問 deepseek 我們訪問 deepseek &#xff0c;把我們想要輸入的內容告訴…

初始提示詞(Prompting)

理解LLM架構 在自然語言處理領域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型記憶語言模型&#xff09;架構代表了最前沿的技術。它結合了存儲和檢索外部知識的能力以及大規模語言模型的強大實力。 LLM架構由外部記憶模塊、注意力機制和語…

【IDEA】IDEA常用的VM配置,優化配置讓開發過程更順暢

日常開發中&#xff0c;如果使用IDEA卡頓、卡死&#xff0c;一般是需要根據自己電腦的實際性能調整VM參數&#xff0c;才能有更好的開發體驗。 設置方法 選擇Help>Edit Custom VM Options&#xff0c;粘貼以下內容&#xff0c;重啟 IntelliJ IDEA使配置生效。 idea64.exe.…

【Python爬蟲】利用代理IP爬取跨境電商AI選品分析

引言 隨著DeepSeek的流行&#xff0c;越來越多的用戶開始嘗試將AI工具融入到日常工作當中&#xff0c;借助AI的強大功能提高工作效率。最近又掀起了一波企業出海的小高潮&#xff0c;那么如果是做跨境電商業務&#xff0c;怎么將AI融入工作流中呢&#xff1f;在做跨境電商的時候…

【Flink銀行反欺詐系統設計方案】1.短時間內多次大額交易場景的flink與cep的實現

【flink應用系列】1.Flink銀行反欺詐系統設計方案 1. 經典案例&#xff1a;短時間內多次大額交易1.1 場景描述1.2 風險判定邏輯 2. 使用Flink實現2.1 實現思路2.2 代碼實現2.3 使用Flink流處理 3. 使用Flink CEP實現3.1 實現思路3.2 代碼實現 4. 總結 1. 經典案例&#xff1a;短…

C語言——鏈表

大神文獻&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目錄 一、鏈表概念 1. 什么是鏈表&#xff1f; 1.1 鏈表的構成 2. 鏈表和數組的區別 數組的特點&#xff1a; 鏈表的特點&#xff1a; 二者對比&#xff1a; 二…

Spring框架自帶的定時任務:Spring Task詳解

文章目錄 一、基本使用1、配置&#xff1a;EnableScheduling2、觸發器&#xff1a;Scheduled 二、拓展1、修改默認的線程池2、springboot配置 三、源碼分析參考資料 一、基本使用 1、配置&#xff1a;EnableScheduling import org.springframework.context.annotation.Config…

數據庫事務、樂觀鎖及悲觀鎖

參考&#xff1a;node支付寶支付及同步、異步通知、主動查詢支付寶訂單狀態 以下容結合上述鏈接查看 1. 什么是數據庫事務&#xff1f; 1.1. 連續執行數據庫操作 在支付成功后&#xff0c;我們在自定義的paidSuccess里&#xff0c;依次更新了訂單狀態和用戶信息。也就說這里…

Android 創建一個全局通用的ViewModel

&#xff08;推薦&#xff09;使用ViewModelStore 代碼示例&#xff1a; class MyApplication : Application(), ViewModelStoreOwner {private val mViewModelStore ViewModelStore()override fun onCreate() {super.onCreate()}override val viewModelStore: ViewModelSto…

SCI期刊推薦 | 免版面費 | 計算機領域:信息系統、軟件工程、自動化和控制

在學術研究領域&#xff0c;選擇合適的SCI期刊對科研成果的傳播與認可至關重要。了解SCI期刊的研究領域和方向是基礎&#xff0c;確保投稿內容與期刊主題相符。同時&#xff0c;要關注期刊的影響因子和評估標準&#xff0c;選擇具有較高影響力和學術認可度的期刊。閱讀期刊的投…

解鎖Android RemoteViews:跨進程UI更新的奧秘

一、RemoteViews 簡介 在 Android 開發的廣闊領域中&#xff0c;RemoteViews 是一個獨特且重要的概念&#xff0c;它為開發者提供了一種在其他進程中顯示視圖結構的有效方式。從本質上講&#xff0c;RemoteViews 并非傳統意義上在當前應用進程內直接渲染和操作的 View&#xf…

常見webshell工具的流量特征

1、蟻劍 1.1、蟻劍webshell靜態特征 蟻劍中php使用assert、eval執行&#xff1b;asp只有eval執行&#xff1b;在jsp使用的是Java類加載&#xff08;ClassLoader&#xff09;&#xff0c;同時會帶有base64編碼解碼等字符特征。 1.2、蟻劍webshell動態特征 查看流量分析會發現…

爬蟲系列之【數據解析之bs4】《四》

目錄 前言 一、用法詳解 1.1 獲取標簽內容 1.2 獲取標簽屬性 1.3 獲取標簽包裹的文本內容 1.4 獲取標簽列表 1.5 css 選擇器&#xff1a;select 二、實戰案例 完整代碼 前言 HTML數據解析 1、正則 2、xpath&#xff08;居多&#xff09; 3、css 選擇器&#xff08;bs…