【前綴和】矩陣區域和(medium)

矩陣區域和(medium)

  • 題?描述:
  • 解法:
  • 代碼
    • Java 算法代碼:
    • C++ 算法代碼:

題?描述:

題?鏈接:1314. 矩陣區域和

給你?個 m x n 的矩陣 mat 和?個整數 k ,請你返回?個矩陣 answer ,其中每個 answer[i][j] 是所有滿?下述條件的元素 mat[r][c] 的和:
? i - k <= r <= i + k,
? j - k <= c <= j + k 且
? (r, c) 在矩陣內。
?例 1:
輸?:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
輸出:[[12,21,16],[27,45,33],[24,39,28]]
?例 2:
輸?:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
輸出:[[45,45,45],[45,45,45],[45,45,45]]
提?:
m = = mat.length
n = = mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100

解法:

算法思路:
在這里插入圖片描述
?維前綴和的簡單應?題,關鍵就是我們在填寫結果矩陣的時候,要找到原矩陣對應區域的「左上?」以及「右下?」的坐標(推薦?家畫圖)
左上?坐標: x1 = i - k,y1 = j - k ,但是由于會「超過矩陣」的范圍,因此需要對 0
取?個 max 。因此修正后的坐標為: x1 = max(0, i - k), y1 = max(0, j - k) ;
右下?坐標: x1 = i + k,y1 = j + k ,但是由于會「超過矩陣」的范圍,因此需要對 m

  • 1 ,以及 n - 1 取?個 min 。因此修正后的坐標為: x2 = min(m - 1, i + k),
    y2 = min(n - 1, j + k) 。
    然后將求出來的坐標代?到「?維前綴和矩陣」的計算公式上即可~(但是要注意下標的映射關系)
    ![![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/62e1f6f110f14ec98b6257dd19da3768.png)
    在這里插入圖片描述

代碼

Java 算法代碼:

class Solution {public int[][] matrixBlockSum(int[][] mat, int k) {int m = mat.length, n = mat[0].length;// 1. 預處理前綴和矩陣int[][] dp = new int[m + 1][n + 1];//方便處理邊界情況for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];//注意不是+mat[i][j]// 2. 使?int[][] ret = new int[m][n];for(int i = 0; i < m; i++)for(int j = 0; j < n; j++){int x1 = Math.max(0, i - k) + 1, y1 = Math.max(0, j - k) + 1;int x2 = Math.min(m - 1, i + k) + 1, y2 = Math.min(n - 1, j + k) + 1;ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];}return ret;}
}

C++ 算法代碼:

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));// 1. 預處理前綴和矩陣for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];// 2. 使?vector<vector<int>> ret(m, vector<int>(n));for(int i = 0; i < m; i++)for(int j = 0; j < n; j++){int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];}return ret;}
};

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

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

相關文章

Java學習手冊:Java發展歷史與版本特性

Java作為全球最流行的編程語言之一&#xff0c;其發展歷程不僅見證了技術的演進&#xff0c;也反映了軟件開發模式的變革。從1995年的首次發布到如今的持續更新&#xff0c;Java始終保持著強大的生命力和廣泛的影響力。本文將簡要回顧Java的發展歷程&#xff0c;并重點介紹其關…

winserver2022備份

安裝備份&#xff0c;然后等待安裝完成即可 然后可以在這里看到安裝好的win server2022備份 一直下一步然后到這里 不要用本地文件夾備份 備份到遠程服務器&#xff0c;遠程服務器路徑 然后確定備份即可 如何恢復呢&#xff1f; 點擊右側的恢復就可以了 打開任務計劃程序 這…

Unity 設置彈窗Tips位置

根據鼠標位于屏幕的區域&#xff0c;設置彈窗錨點以及位置 public static void TipsPos(Transform tf) {//獲取ui相機var uiCamera GetUICamera();var popup tf.GetComponent<RectTransform>();//獲取鼠標位置Vector2 mousePos Input.mousePosition;float screenWidt…

【C++基礎-關鍵字】:extern

深入理解 C++ 關鍵字 extern 在 C++ 編程中,extern 關鍵字扮演著重要角色,主要用于聲明全局變量或函數,使其在多個源文件間共享。本文將詳細探討 extern 的用法及其在實際開發中的應用。 1. 什么是 extern? extern 關鍵字用于聲明一個變量或函數的引用,表示該變量或函數…

我為女兒開發了一個游戲網站

大家好&#xff0c;我是星河。 自從協助妻子為女兒開發了算數射擊游戲后&#xff0c;星河就一直有個想法&#xff1a;為女兒打造一個專屬的學習游戲網站。之前的射擊游戲雖然有趣&#xff0c;但缺乏難度分級&#xff0c;無法根據女兒的學習進度靈活調整。而且&#xff0c;僅僅…

基于 Python 卷積神經網絡的新聞文本分類系統,附源碼

大家好&#xff0c;我是徐師兄&#xff0c;一個有著7年大廠經驗的程序員&#xff0c;也是一名熱衷于分享干貨的技術愛好者。平時我在 CSDN、掘金、華為云、阿里云和 InfoQ 等平臺分享我的心得體會。今天我來跟大家聊聊一個用 Python 和 Django 打造的人臉識別考勤系統&#xff…

ngx_cycle_modules

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_cycle_modules-CSDN博客 定義在 src/core/ngx_module.c ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle) {/** create a list of modules to be used for this cycle,* copy static modules to it*/cycle->modules ngx_pcalloc(…

AI 代碼生成工具如何突破 Java 單元測試效能天花板?

一、傳統單元測試的四大痛點 時間黑洞&#xff1a;根據 JetBrains 調研&#xff0c;Java 開發者平均花費 35% 時間編寫測試代碼覆蓋盲區&#xff1a;手工測試覆蓋率普遍低于 60%&#xff08;Jacoco 全球統計數據&#xff09;維護困境&#xff1a;業務代碼變更導致 38% 的測試用…

【保姆級圖解】插入排序 算法詳解:直接插入排序、希爾排序

總體引入 在計算機科學的算法領域中&#xff0c;排序是一項基礎且重要的操作。它旨在將一組無序的數據元素重新排列為有序序列&#xff0c;以滿足特定的順序要求&#xff0c;如升序或降序。常見的排序算法可分為不同類別&#xff0c;像插入排序&#xff0c;包含直接插入排序和…

為什么ChatGPT選擇SSE而非WebSocket?

為什么ChatGPT選擇SSE而非WebSocket&#xff1f; 一、ChatGPT回答問題的技術邏輯 ChatGPT的響應生成基于Transformer架構和自注意力機制&#xff0c;其核心是通過概率預測逐詞生成文本。當用戶輸入問題后&#xff0c;模型會先解析上下文&#xff0c;再通過預訓練的龐大語料庫…

Android 手機指紋傳感器無法工作,如何恢復數據?

天津鴻萌科貿發展有限公司從事數據安全服務二十余年&#xff0c;致力于為各領域客戶提供專業的數據恢復、數據清除、數據備份、數據取證、數據遷移解決方案&#xff0c;并針對企業面臨的數據安全風險&#xff0c;提供專業的相關數據安全培訓。 天津鴻萌科貿發展有限公司是眾多國…

DeepSeek 在金融領域的應用解決方案

DeepSeek 在金融領域的應用解決方案 一、背景 隨著人工智能技術的快速發展&#xff0c;DeepSeek 作為一款國產大模型&#xff0c;憑借其強大的語義理解、邏輯推理和多模態處理能力&#xff0c;在金融行業迅速嶄露頭角。金融行業作為經濟的核心&#xff0c;面臨著激烈的市場競…

織光五載 煥新啟航

成都時尚產業協會5周年 以創新為筆&#xff0c;續寫國際時尚之都的璀璨篇章 【一場跨越時空的時尚對話】 五年前&#xff0c;一顆名為"成都時尚產業協會"的種子在蓉城落地生根&#xff1b;五年后&#xff0c;這棵新芽已成長為枝繁葉茂的生態之樹&#xff0c;用交織…

scala集合

一、數組&#xff08;Array&#xff09; 1.數組轉換 不可變轉可變&#xff1a;arr1.toBuffer&#xff0c;arr1本身沒有變化 可變轉不可變&#xff1a;arr2.toArray&#xff0c;arr2本身沒有變化 2.多維數組 創建&#xff1a;val arr Array.ofDim[Int](3, 4)&#xff08;3 …

常用 Excel VBA 技巧,簡單好學易上手

在日常辦公中&#xff0c;我們常常會遇到各種繁瑣的數據處理任務&#xff0c;而 Excel VBA&#xff08;Visual Basic for Applications&#xff09;作為一款強大的自動化工具&#xff0c;能夠幫助我們輕松應對這些挑戰。本文將介紹一些常用且簡單好學的 Excel VBA 技巧&#xf…

Java 基礎 - 反射(1)

文章目錄 引入類加載過程1. 通過 new 創建對象2. 通過反射創建對象2.1 觸發加載但不初始化2.2 按需觸發初始化2.3 選擇性初始化控制 核心用法示例1. 通過無參構造函數創建實例對象2. 通過有參構造函數創建實例對象3. 反射通過私有構造函數創建對象&#xff0c; 破壞單例模式4. …

如何在React中集成 PDF.js?構建支持打印下載的PDF閱讀器詳解

本文深入解析基于 React 和 PDF.js 構建 PDF 查看器的實現方案&#xff0c;該組件支持 PDF 渲染、圖片打印和下載功能&#xff0c;并包含完整的加載狀態與錯誤處理機制。 完整代碼在最后 一個PDF 文件&#xff1a; https://mozilla.github.io/pdf.js/web/compressed.tracemo…

數據結構與算法-動態規劃-線性動態規劃,0-1背包,多重背包,完全背包,有依賴的背包,分組背包,背包計數,背包路徑

動態規劃原理 動態規劃這玩意兒&#xff0c;就好比是在拓撲圖上玩跳格子游戲。在圖論中&#xff0c;咱們是從特定的節點跳到其他節點&#xff1b;而在動態規劃里呢&#xff0c;我們是從一個狀態 “嗖” 地轉移到另一個狀態。狀態一般用數組來表示&#xff0c;就像 f [i][j]&am…

解決文件夾解壓中文字符產生亂碼的問題

太tm智能了&#xff0c;本來還想看看解壓工具在哪里修改&#xff0c;智能的識別到亂碼了。點贊 看到那個地球了嗎&#xff0c;點擊那個球&#xff0c;這個修改不是侵略性的&#xff0c;不會修改壓縮文件本身所以需要在當前頁面解壓 參考 https://blog.csdn.net/QCSYSZQ/artic…

C++與C的區別

目錄 前言 一、從字面上看 二、從編程思想上看 三、C 和 C++ 都有各自適合的領域和特性 四、劃重點 前言 本文主要對 C 和 C++ 兩種編程語言進行對比區分,便于大家理解 一、從字面上看 1.首先:兩者第一個字符完全一致 說明:C++ 完全兼容 C ,凡是合法的 C 程序在 C…