leetcode304. 二維區域和檢索 - 矩陣不可變

給定一個二維矩陣,計算其子矩形范圍內元素的總和,該子矩陣的左上角為 (row1,?col1) ,右下角為 (row2,?col2)。


上圖子矩陣左上角?(row1, col1) = (2, 1)?,右下角(row2, col2) = (4, 3),該子矩形內元素的總和為 8。

示例:

給定 matrix = [
? [3, 0, 1, 4, 2],
? [5, 6, 3, 2, 1],
? [1, 2, 0, 1, 5],
? [4, 1, 0, 1, 7],
? [1, 0, 3, 0, 5]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12
說明:

你可以假設矩陣不可變。
會多次調用?sumRegion?方法。
你可以假設?row1 ≤ row2 且?col1 ≤ col2。

思路:

我們想求黑框框,應該黃框框+紅框框-灰框框(紅黃重合部分加了兩次所以要減去)

請注意:

不要忘了判空。

class NumMatrix {int[][] temp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;int lenA=matrix.length;int lenB=matrix[0].length;temp=new int[lenA][lenB];temp[0][0]=matrix[0][0];for(int i=1;i<lenA;i++){temp[i][0]=temp[i-1][0]+matrix[i][0];}for(int i=1;i<lenB;i++){temp[0][i]=temp[0][i-1]+matrix[0][i];}for(int i=1;i<lenA;i++){for(int j=1;j<lenB;j++){temp[i][j]=temp[i-1][j]+temp[i][j-1]-temp[i-1][j-1]+matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {int A=col1>0?temp[row2][col1-1]:0;int B=row1>0?temp[row1-1][col2]:0;int C=A==0 || B==0?0:temp[row1-1][col1-1];return temp[row2][col2]-A-B+C;}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

這個代碼還不對,看求C的時候,我使用A和B區域是否等于零來判斷是否是邊界,其實是不對的(萬一一堆數加起來真的等于零呢)

最終:

class NumMatrix {int[][] temp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;int lenA=matrix.length;int lenB=matrix[0].length;temp=new int[lenA][lenB];temp[0][0]=matrix[0][0];for(int i=1;i<lenA;i++){temp[i][0]=temp[i-1][0]+matrix[i][0];}for(int i=1;i<lenB;i++){temp[0][i]=temp[0][i-1]+matrix[0][i];}for(int i=1;i<lenA;i++){for(int j=1;j<lenB;j++){temp[i][j]=temp[i-1][j]+temp[i][j-1]-temp[i-1][j-1]+matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {int A=col1>0?temp[row2][col1-1]:0;int B=row1>0?temp[row1-1][col2]:0;int C=col1==0 || row1==0?0:temp[row1-1][col1-1];return temp[row2][col2]-A-B+C;}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

官方:思路一樣,在數組左邊和上邊加了一層,寫起來方便很多,我給忘了可以這么寫了。

又被官方虐了55555

private int[][] dp;public NumMatrix(int[][] matrix) {if (matrix.length == 0 || matrix[0].length == 0) return;dp = new int[matrix.length + 1][matrix[0].length + 1];for (int r = 0; r < matrix.length; r++) {for (int c = 0; c < matrix[0].length; c++) {dp[r + 1][c + 1] = dp[r + 1][c] + dp[r][c + 1] + matrix[r][c] - dp[r][c];}}
}public int sumRegion(int row1, int col1, int row2, int col2) {return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
}

?

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

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

相關文章

(九)nodejs循序漸進-Express框架(進階篇)

Express 框架 Express 是一個簡潔而靈活的 node.js Web應用框架, 提供了一系列強大特性幫助你創建各種 Web 應用&#xff0c;和豐富的 HTTP 工具。 使用 Express 可以快速地搭建一個完整功能的網站。 Express 框架核心特性&#xff1a; 可以設置中間件來響應 HTTP 請求。 定…

leetcode326. 3的冪 如此6的操作你想到了嗎

給定一個整數&#xff0c;寫一個函數來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4: 輸入: 45 輸出: false 進階&#xff1a; 你能不使用循環或者遞歸來完成本題嗎&#xff1f; 注意最后一句…

(十)nodejs循序漸進-高性能游戲服務器框架pomelo之介紹和安裝篇

目錄 Pomelo 安裝Pomelo 創建demoserver項目 pomelo命令 項目結構說明 pomelo框架 架構 服務器實現 客戶端請求與響應、廣播的抽象介紹 Pomelo pomelo是一個快速、可擴展、Node.js分布式游戲服務器框架&#xff0c;對游戲服務器開發感興趣的同學可以關注關注。 之前…

leetcode344. 反轉字符串 史上最簡單力扣題

編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中的所有字符都是 ASCII 碼表中的可打印字符。…

(十一)nodejs循序漸進-高性能游戲服務器框架pomelo之啟動流程和組件

游戲啟動過程 啟動入口 在使用pomelo進行游戲開發時&#xff0c;工程目錄下的app.js是整個游戲服務器的啟動運行入口。app.js中創建項目&#xff0c;進行默認配置并啟動服務器的代碼如下&#xff1a; var pomelo require(pomelo); var app pomelo.createApp(); app.set(na…

(十二)nodejs循序漸進-高性能游戲服務器框架pomelo之創建一個游戲聊天服務器

上個章節我們簡單介紹了下pomelo的安裝和目錄結構&#xff0c;有讀者可能覺得有點吃不消&#xff0c;為什么不再深入講一講目錄結構和里邊的庫&#xff0c;這里我就不費口舌了&#xff0c;大家可以去官網參考文檔說明&#xff0c;本文只告訴大家如何利用這個框架來開發自己的東…

看這玩意復習你還會掛科?《軟件工程篇》

軟件工程&#xff1a;是指導軟件開發和維護的一門工程學科 三要素方法/工具/開發過程 價值&#xff1a;促進項目成功 現代產品開發三原則&#xff1a;功用性、可行性、稱許性 軟件過程是軟件工程的核心組成部分。 迭代 &#xff1a;反復求精 增量&#xff1a;逐塊建造 需…

C++:02---命名空間

一、概念: ①類似于倉庫,空間內存儲代碼,需要用到時調用②也為防止名字沖突提供了更加可控的機制二、命名空間的定義 定義的基本格式如下:namespace 命名空間名 { //一系列聲明與定義 };三、命名空間的注意事項 命名空間定義時最后的分號可有可無只要出現在全局作用域中的…

看這玩意復習你還會掛科?《軟件工程2篇》

第一章&#xff1a; 軟件工程定義&#xff1a; 1968年10月&#xff0c;Fritz Bauer 首次提出了“軟件工程”的概念&#xff0c;并將“軟件工程”定義為&#xff1a;為了經濟地獲得能夠在實際機器上有效運行的可靠軟件&#xff0c;而建立并使用的一系列工程化原則。 1993年IE…

C++:05---命名空間

一、概念: ①類似于倉庫,空間內存儲代碼,需要用到時調用②也為防止名字沖突提供了更加可控的機制二、命名空間的定義 定義的基本格式如下:namespace 命名空間名 { //一系列聲明與定義 };三、命名空間的注意事項 命名空間定義時最后的分號可有可無只要出現在全局作用域中的…

C++:04---內聯函數

1.概念: 內聯類似于宏定義,當程序執行到內聯函數時,相當于復制了一份函數代碼。犧牲代碼空間,贏得了時間 內聯說明只是向編譯器發出一個請求,編譯器可以選擇忽略這個請求 2.關鍵字:inline 聲明時寫了inline,定義時可省略。建議聲明和定義都加上inlineinline int add(int…

leetcode86. 分隔鏈表

給定一個鏈表和一個特定值 x&#xff0c;對鏈表進行分隔&#xff0c;使得所有小于 x 的節點都在大于或等于 x 的節點之前。 你應當保留兩個分區中每個節點的初始相對位置。 示例: 輸入: head 1->4->3->2->5->2, x 3 輸出: 1->2->2->4->3->5…

(十三)nodejs循序漸進-高性能游戲服務器框架pomelo之擴展聊天服務器為機器人自動聊天

聊天服務器擴展 大家在上一篇文章里相信已經學會了pomelo框架的基本用法了&#xff0c;那么我們在上一篇文章的代碼基礎上繼續擴展&#xff0c;豐富系統&#xff0c;另外也熟悉下他的更多的用法&#xff0c;這一節我將擴展它&#xff1a;增加一個機器人自動聊天的功能。 目的…

C++:09---類靜態成員、類常量成員

一、類靜態成員(static) 先介紹一下什么是靜態變量、靜態函數 靜態局部變量:存在域(全局數據區),作用域(塊作用域)靜態全局變量:存在域(全局數據區),作用域(整個文件)靜態函數:存在域(全局數據區),作用域(整個文件)static int a=10;//全局靜態變量 static vo…

C++:08---成員變量初始化方式

成員變量初始化有三種方式: 在構造函數體內賦值初始化在自定義的公有函數體中賦值初始化(一般用于成員變量的初始化)在構造函數的成員初始化列表初始化一、構造函數體內初始化 說明:在構造函數體內的初始化方式,本質是是為成員變量賦值,而不是真正意義上的初始化,這點要…

leetcode1290. 二進制鏈表轉整數 刷新認知,最簡單算法題

給你一個單鏈表的引用結點 head。鏈表中每個結點的值不是 0 就是 1。已知此鏈表是一個整數數字的二進制表示形式。 請你返回該鏈表所表示數字的 十進制值 。 示例 1&#xff1a; 輸入&#xff1a;head [1,0,1] 輸出&#xff1a;5 解釋&#xff1a;二進制數 (101) 轉化為十進…

Redis:02---安裝Redis(Linux+Windows+Docker)

Linux安裝&#xff1a;一、安裝方式1&#xff08;下載源碼編譯安裝&#xff09;第一步&#xff1a;從下面的網址中下載Redis最新穩定版本的源代碼sudo wget http://download.redis.io/redis-stable.tar.gz第二步&#xff1a;下載完之后解壓&#xff0c;建立一個軟鏈接指向于red…

C++:10---再議拷貝構造函數

一、概念 使用一個已經存在的對象,去構造(初始化)另一個對象二、格式 參數加上const&,因為拷貝構造函數在幾種情況下都會被隱式地使用,因此拷貝構造函數不應該是explict的const:防止函數內部修改值&:防止無限循環拷貝類名(類名 const& 參數名) { 函數體 }三、…

人的思維謬誤與心理學效應

啟發法 用一個容易的問題代替難以回答的真正問題。這個容易的問題的答案就是對真正問題的啟發&#xff0c;但啟發經常和真正的答案差得很遠&#xff0c;而人卻往往把啟發當成了真正問題的答案。 接下來介紹和啟發法相關的心理效應和謬誤。每一個謬誤都會注明真正的問題是什么…

C++:07---this指針

一、this指針介紹 概念:this指針是成員函數的一個隱式參數,在類中本質上就是對象的指針(常量指針)特點:在成員函數中可通過this指針區別成員變量與形參變量this可以顯式調用示例代碼:class Cperson { private: int age; float height; public: void InitPerson(int age,flo…