力扣 第 387 場周賽 解題報告 | 珂學家 | 離散化樹狀數組 + 模擬場


前言

image.png


整體評價

手速場+模擬場,思路和解法都蠻直接的。

所以搞點活

  • 如果T2,如果不固定左上角,批量查詢某個點為左上角,求滿足總和 ≤ k \le k k的子矩陣個數

  • 如果T2,如果不固定左上角,求總和 ≤ k \le k k的子矩陣個數

  • 如果T3, 數值不局限于0,1,2, 求最小操作數


A. 將元素分配到兩個數組中 I

思路: 模擬

模擬即可,沒啥可說的。

class Solution {public int[] resultArray(int[] nums) {List<Integer> r1 = new ArrayList<>(List.of(nums[0]));List<Integer> r2 = new ArrayList<>(List.of(nums[1]));for (int i = 2; i < nums.length; i++) {if (r1.get(r1.size() - 1) > r2.get(r2.size() - 1)) {r1.add(nums[i]);} else {r2.add(nums[i]);}}r1.addAll(r2);return r1.stream().mapToInt(Integer::valueOf).toArray();}
}

B. 元素和小于等于 k 的子矩陣的數目

思路: 二維前綴和 + 枚舉

因為固定左上角,所以子矩陣的個數為 n ? m n * m n?m

前綴和預處理, O ( n ? m ) O(n * m) O(n?m)

枚舉子矩陣為, O ( n ? m ) O(n * m) O(n?m)

class Solution {public int countSubmatrices(int[][] grid, int k) {int h = grid.length, w = grid[0].length;long[][] pre = new long[h + 1][w + 1];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {pre[i + 1][j + 1] = pre[i + 1][j] + pre[i][j + 1] - pre[i][j] + grid[i][j];}}int res = 0;for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {if (pre[i + 1][j + 1] <= k) {res ++;}}}return res;}
}

思考:

如果左上角并不固定,而且以任意點出發,求滿足要求的子矩陣數? 而且這個查詢量不小?

那面對這個問題,該如何求解呢?

感覺一次查詢,可以從 O ( n ? m ) 優化為 O ( n + m ) O(n * m) 優化為 O(n+m) O(n?m)優化為O(n+m),就是從右上點出發,逐漸收斂到左下。


C. 在矩陣上寫出字母 Y 所需的最少操作次數

思路: 模擬 + 枚舉組合

唯一可以增加難度的是,不限定數值范圍

不過這也才基本的nlargest問題

class Solution {boolean isJudge(int y, int x, int n) {if (y == x && y <= n / 2) {return true;}if (y + x == n - 1 && y <= n / 2) {return true;}if (y >= n / 2 && x == n / 2) {return true;}return false;}public int minimumOperationsToWriteY(int[][] grid) {int n = grid.length;int[] ys = new int[3];int[] nys = new int[3];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int id = grid[i][j];if (isJudge(i, j, n)) {ys[id]++;} else {nys[id]++;}}}// 枚舉即可int res = n * n;int totYs = n/2 + n/2 + n/2 + 1;int totNys = n * n - totYs;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (i != j) {res = Math.min(res, (totYs - ys[i]) + (totNys - nys[j]));}}}return res;}}

D. 將元素分配到兩個數組中 II

思路:離散化 + 樹狀數組

板子題,而且非常的直接

class Solution {static class BIT {int n;int[] arr;public BIT(int n) {this.n =n;this.arr = new int[n + 1];}int query(int p) {int res = 0;while (p > 0) {res += arr[p];p -= p & -p;}return res;}void update(int p, int d) {while (p <= n) {arr[p] += d;p += p & -p;}}}public int[] resultArray(int[] nums) {List<Integer> arr1 = new ArrayList<>(List.of(nums[0]));List<Integer> arr2 = new ArrayList<>(List.of(nums[1]));// 離散化過程TreeSet<Integer> ts = new TreeSet<>();for (int v: nums) ts.add(v);int ptr = 1;Map<Integer, Integer> idMap = new HashMap<>();for (var k: ts) {idMap.put(k, ptr++);}// 樹狀數組模擬過程BIT bit1 = new BIT(ptr);BIT bit2 = new BIT(ptr);bit1.update(idMap.get(nums[0]), 1);bit2.update(idMap.get(nums[1]), 1);for (int i = 2; i < nums.length; i++) {int v = nums[i];Integer k = idMap.get(v);int cnt1 = bit1.query(ptr) - bit1.query(k);int cnt2 = bit2.query(ptr) - bit2.query(k);if (cnt1 > cnt2 || (cnt1 == cnt2 && arr2.size() >= arr1.size())) {arr1.add(v);bit1.update(k, 1);} else {arr2.add(v);bit2.update(k, 1);} }arr1.addAll(arr2);return arr1.stream().mapToInt(Integer::valueOf).toArray();}
}

寫在最后

image.png

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

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

相關文章

Spring的Bean的生命周期 | 有圖有案例

Spring的Bean的生命周期 Spring的Bean的生命周期整體過程實例化初始化服務銷毀循環依賴問題 完整生命周期演示 Spring的Bean的生命周期 Spring Bean的生命周期&#xff1a;從Bean的實例化之后&#xff0c;通過反射創建出對象之后&#xff0c;到Bean稱為一個完整的對象&#xf…

EXPLAIN:mysql 執行計劃分析詳解

目錄 EXPLAIN命令 查看執行計劃 分析執行計劃 優化查詢 EXPLAIN中的 type 列類型 在MySQL中&#xff0c;你可以使用EXPLAIN命令來生成查詢的執行計劃。EXPLAIN命令可以顯示MySQL如何使用鍵來處理SELECT和DELETE語句&#xff0c;以及INSERT或UPDATE語句的WHERE子句。這對于…

SRS Stack提供的鑒權、私人直播間、多平臺轉播、錄制等高級功能的具體使用方法是什么?

SRS Stack提供的鑒權、私人直播間、多平臺轉播、錄制等高級功能的具體使用方法是什么&#xff1f; 鑒權功能&#xff1a;SRS Stack支持通過系統配置中的OpenAPI獲取Bearer鑒權&#xff0c;并可以嘗試HTTP API。用戶可以通過點擊網頁上的按鈕請求HTTP API&#xff0c;或者使用cu…

快上車:什么是人工智能?人工智能和普通程序的區別

什么是人工智能&#xff1f; 雖然AI歷史很悠久&#xff0c;上個世紀50年代就有各種概念&#xff0c;但是發展很慢。第一次對人類的沖擊就是1997年IBM深藍擊敗國際象棋世界冠軍&#xff0c;引起了人們的廣泛關注&#xff0c;之后又銷聲匿跡。突然間2016人工智能alphaGO戰勝了圍…

具身智能計算系統,機器人時代的 Android | 新程序員

【導讀】具身智能作為一種新興的研究視角和方法論&#xff0c;正在刷新我們對智能本質及其發展的理解&#xff1a;傳統的 AI 模型往往將智能視為一種獨立于實體存在的抽象能力&#xff0c;而具身智能則主張智能是實體與其環境持續互動的結果。 本文深度剖析了具身智能計算系統…

【CSS】初學了解Grid布局

目錄 什么是Grid布局如何開始使用Grid布局Grid容器的屬性Grid項目的屬性舉個例子 什么是Grid布局 Grid布局是一種二維的布局系統&#xff0c;它允許我們在水平和垂直方向上同時控制網格中的項目位置。通過將頁面劃分為行和列&#xff0c;我們可以輕松地創建出復雜的布局結構&a…

程序員如何選擇職業賽道?

一、自我評估與興趣探索 程序員選擇職業賽道時&#xff0c;可以考慮以下幾個關鍵因素&#xff1a; 1、興趣與熱情&#xff1a;首先要考慮自己的興趣和熱情&#xff0c;選擇符合個人喜好和激情的領域&#xff0c;能夠激勵自己持續學習和進步。 2、技術能力&am…

2.python72變筆記(自用未修改版)

以前寫的python筆記 1.二進制與字符編碼 #8bit&#xff08;位&#xff09;1byte&#xff08;字節&#xff09; #1024byte 1KB 千字節 #1024KB 1MB 兆字節 #1024MB 1TB 太字節 print(chr(0b100111001010000)) print(ord("陳")) #ord 十進制 #無論英語還是漢語在計算…

mysql5.7配置主從

原理&#xff1a; MySQL主從復制的工作原理如下:1. 主服務器產生Binlog日志當主服務器的數據庫發生數據修改操作時,如INSERT、UPDATE、DELETE語句執行,主服務器會記錄這些操作的日志信息到二進制日志文件中。2. 從服務器讀取Binlog日志 從服務器會向主服務器發送請求,主服務器把…

微信小程序開發學習筆記《18》uni-app框架-網絡請求與輪播圖

微信小程序開發學習筆記《18》uni-app框架-網絡請求 博主正在學習微信小程序開發&#xff0c;希望記錄自己學習過程同時與廣大網友共同學習討論。建議仔細閱讀uni-app對應官方文檔 一、下載網絡請求包 這個包是以前黑馬程序員老師寫的一個包&#xff0c;跟著課程學習&#x…

Open3D(C++) 指定點數的體素濾波

目錄 一、算法原理1、算法過程2、參考文獻二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT。 一、算法原理 1、算法過程 對于數據量較大的點云,在后期進行配準時會影響計算效率。而體素格網…

vue3ts websocket通信

前端&#xff1a;vue3ts 后端&#xff1a;springboot npm安裝依賴 cnpm install sockjs-client stompjs 前端代碼 <template><div><el-input v-model"message" type"text" placeholder"發送" /><el-button-group><…

LCR 170. 交易逆序對的總數

解題思路&#xff1a; 歸并排序&#xff0c;在歸并的過程中不斷計算逆序對的個數 count mid -i 1&#xff1b;的來源見下圖&#xff0c;因為兩個數組都是單調遞增的&#xff0c;所以如果第一個數組的前一個元素大于第二個數組的對應元素&#xff0c;那么第一個數組的這一元素…

借助Aspose.SVG圖像控件,在 C# 中將圖像轉換為 Base64

Base64 編碼是一種二進制到文本的編碼方案&#xff0c;可有效地將二進制數據轉換為 ASCII 字符&#xff0c;為數據交換提供通用格式。在某些情況下&#xff0c;我們可能需要將JPG或PNG圖像轉換為 Base64 字符串數據。在這篇博文中&#xff0c;我們將學習如何在 C# 中將圖像轉換…

分享經典、現代和前沿軟件工程課程

隨著信息技術的發展&#xff0c;軟件已經深入到人類社會生產和生活的各個方面。軟件工程是將工程化的方法運用到軟件的開發、運行和維護之中&#xff0c;以達到提高軟件質量&#xff0c;降低開發成本的目的。軟件工程已經成為當今最活躍、最熱門的學科之一。 本次軟件工程MOOC課…

模板06-普通函數與函數模板調用規則

1、如果函數模板和普通函數都可以實現&#xff0c;優先調用普通函數 2、可以通過空模板參數列表來強調調用函數模板 3、函數模板也可以發生重載 4、如果函數模板可以發生更好的匹配&#xff0c;優先調用函數模板 #include <iostream> using namespace std;int my_add …

混合云技術架構是什么樣的

混合云技術架構是什么樣的&#xff1f;混合云技術架構是一種將公有云和私有云相結合的云計算架構。它允許組織在私有云和公有云之間靈活地共享和遷移應用程序、數據和服務。 混合云技術架構的設計可以根據組織的需求和業務要求進行定制&#xff0c;通常包括以下組件&#xff1…

現在如何才能開通微信公眾號留言功能?

為什么公眾號沒有留言功能&#xff1f;2018年2月12日之后直到現在&#xff0c;新注冊公眾號的運營者會發現一個問題&#xff1a;無論是個人還是企業的公眾號&#xff0c;在后臺都找不到留言功能了。這對公眾號來說絕對是一個極差的體驗&#xff0c;少了一個這么重要的功能&…

萬村樂數字鄉村系統開源代碼:革命性引領,助推鄉村振興新篇章

如今&#xff0c;國際社會普遍認為信息化、數字化已是重大且不可逆轉的發展趨勢&#xff0c;如何讓廣大農村地區充分分享到這個發展帶來的紅利&#xff0c;從而提升農村的經濟活力&#xff0c;確保村民生活質量不斷優化&#xff0c;已然成為我們需要認真研究并積極解決的重大議…

Window下編寫的sh文件在Linux/Docker中無法使用

Window下編寫的sh文件在Linux/Docker中無法使用 一、sh文件目的1.1 初始狀態1.2 目的 二、過程與異常2.1 首先獲取標準ubuntu20.04 - 正常2.2 啟動ubuntu20.04容器 - 正常2.3 執行windows下寫的preInstall文件 - 報錯 三、檢查和處理3.1 評估異常3.2 處理異常3.3 調整后運行測試…