備戰藍橋杯————差分數組1

引言

一、差分數組

????????什么是差分數組

????????差分數組的作用

????????Java代碼實現差分數組

二、 區間加法?

????????題目描述

????????代碼與解題思路

總結

引言

????????在數字世界的海洋中,數據是構建和優化算法的基石。然而,當我們面對需要頻繁進行區間操作的數組時,傳統的逐元素處理方法往往會成為效率的瓶頸。想象一下,你手中有一張復雜的數據地圖,需要在短時間內對特定區域進行多次修改,而每一次修改都可能引發連鎖反應。在這種情況下,一種名為“差分數組”的算法技巧就像是一把瑞士軍刀,它不僅能夠簡化操作,還能大幅提升處理速度。本文將帶你深入了解差分數組的魔力,以及它是如何在算法的世界里大放異彩的。

一、差分數組

什么是差分數組

????????差分數組是一種高效的算法技巧,它在處理數組區間操作時特別有用。當你需要頻繁地對數組的某個區間進行元素的增減操作時,使用差分數組可以顯著提高效率。這種方法的核心思想是利用差分來避免對整個區間進行逐個元素的修改。

差分數組的作用

????????在差分數組中,每個元素 delta[i]表示從 original[i-1]?到 original[i]的變化量。通過這種方式,我們可以在 O(1) 時間內完成對任意區間的增減操作,而不是逐個元素地進行 O(N) 時間復雜度的修改。

????????例如,如果我們想要對區間 original[i..j]的元素全部加上一個值 value,我們只需要執行以下兩個操作:

????????1. delta[i] += value:增加區間起始位置的差分。
????????2. delta[j + 1] -= value:減少區間結束位置的下一個位置的差分,以保持差分數組的正確性。

????????通過這種方式,我們可以隨時快速地更新差分數組,并在需要時通過累加差分數組來重構原始數組。這種方法在處理大量區間操作的問題時,如動態數組、區間求和、區間更新等,尤其有用。在實際應用中,我們首先根據原始數組 original?構造差分數組 delta。然后,對于任何區間操作,我們只需要對差分數組進行相應的增減。最后,我們可以通過累加差分數組來得到操作后的原始數組 resultArray。

Java代碼實現差分數組

// 差分數組工具類
class DeltaArray {// 差分數組private int[] delta;/* 輸入一個初始數組,區間操作將在這個數組上進行 */public DeltaArray(int[] original) {assert original.length > 0;delta = new int[original.length];// 根據初始數組構造差分數組delta[0] = original[0];for (int index = 1; index < original.length; index++) {delta[index] = original[index] - original[index - 1];}}/* 給閉區間 [start, end] 增加 value(可以是負數)*/public void modify(int start, int end, int value) {delta[start] += value;if (end + 1 < delta.length) {delta[end + 1] -= value;}}/* 返回結果數組 */public int[] getResult() {int[] resultArray = new int[delta.length];// 根據差分數組構造結果數組resultArray[0] = delta[0];for (int i = 1; i < delta.length; i++) {resultArray[i] = resultArray[i - 1] + delta[i];}return resultArray;}
}

二、 區間加法?

題目描述

????????假設你有一個長度為?n?的數組,初始情況下所有的數字均為?0,你將會被給出?k????????個更新的操作。其中,每個操作會被表示為一個三元組:[startIndex, endIndex, inc],你需要將子數組?A[startIndex ... endIndex](包括 startIndex 和 endIndex)增加?inc。請你返回?k?次操作后的數組。

示例:

輸入: length = 5, updates = [[1,3,2],[2,4,3],[0,2,-2]]
輸出: [-2,0,3,5,3]

解釋:

初始狀態:
[0,0,0,0,0]進行了操作 [1,3,2] 后的狀態:
[0,2,2,2,0]進行了操作 [2,4,3] 后的狀態:
[0,2,5,5,3]進行了操作 [0,2,-2] 后的狀態:
[-2,0,3,5,3]

代碼與解題思路

????????這道題直接使用剛才構建的差分類即可。

?
// 差分數組工具類
class DeltaArray {// 差分數組private int[] delta;/* 輸入一個初始數組,區間操作將在這個數組上進行 */public DeltaArray(int[] original) {assert original.length > 0;delta = new int[original.length];// 根據初始數組構造差分數組delta[0] = original[0];for (int index = 1; index < original.length; index++) {delta[index] = original[index] - original[index - 1];}}/* 給閉區間 [start, end] 增加 value(可以是負數)*/public void modify(int start, int end, int value) {delta[start] += value;if (end + 1 < delta.length) {delta[end + 1] -= value;}}/* 返回結果數組 */public int[] getResult() {int[] resultArray = new int[delta.length];// 根據差分數組構造結果數組resultArray[0] = delta[0];for (int i = 1; i < delta.length; i++) {resultArray[i] = resultArray[i - 1] + delta[i];}return resultArray;}int[] getModifiedArray(int length, int[][] updates) {// nums 初始化為全 0int[] nums = new int[length];// 構造差分解法Difference df = new Difference(nums);for (int[] update : updates) {int i = update[0];int j = update[1];int val = update[2];df.increment(i, j, val);}return df.result();}
}?

總結

????????通過本文的探討,我們不僅揭開了差分數組的神秘面紗,還見證了它在解決實際問題中的強大力量。差分數組不僅是一種高效的算法技巧,更是一種思維方式的轉變。它教會我們在面對復雜問題時,如何通過巧妙的數據結構和算法優化,將問題化繁為簡。在這個數據驅動的時代,掌握差分數組這樣的工具,無疑將為你的編程技能庫增添一把鋒利的劍。無論你是算法競賽的選手,還是日常開發中的工程師,差分數組都將是你解決問題的得力助手。讓我們繼續探索算法的無限可能,用智慧的光芒照亮編程的道路。

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

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

相關文章

ABAP - SALV教程10 添加可編輯checkbox列

幾乎所有的功能報表都會有那么一個選擇列&#xff0c;問了業務顧問&#xff0c;業務顧問說是用戶不習慣使用報表原生的選擇模式。效果圖SALV的選擇列是通過將列設置成checkbox_hotspot樣式&#xff0c;注冊單擊事件完成勾選功能的。完成步驟 將SEL列設置成checkbox_hotspot樣式…

【筆記】OpenHarmony和HarmonyOS區別及應用開發簡介

一、概念 OpenHarmony(OH) &#xff1a; OpenAtom OpenHarmonyHarmonyOS(HO)&#xff1a;開發 | 華為開發者聯盟 (huawei.com) HO當前最高是3.1&#xff0c;在華為mate 60上面也是。關于4.0、5.0和next這類版本說法都是面向用戶的&#xff0c;不是開發人員。對于程序員&#…

Springboot 項目讀取yaml的配置文件信息給靜態方法使用,以及通過配置 ResourceBundle 類讀取config.properties

讀取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 創建一個類 ProxyProperties 讀取配置文件信息&#xff0c;并對外提供get方法 …

內存的檢測與排查

內存&#x1f40e;的檢測與排查 文章目錄 內存&#x1f40e;的檢測與排查查殺Java Web filter型內存馬0x01 內存馬簡歷史0x02 查殺思路0x03 內存馬的識別0x04 內存馬的查殺 查殺Java Web filter型內存馬 0x01 內存馬簡歷史 其實內存馬由來已久&#xff0c;早在17年n1nty師傅的…

QT6 libModbus 用于ModbusTcp客戶端讀寫服務端

雖然在以前的文章中多次描述過,那么本文使用開源庫libModbus,可得到更好的性能&#xff0c;也可移植到各種平臺。 性能&#xff1a;讀1次和寫1次約各用時2ms。 分別創建了讀和寫各1個連接指針&#xff0c;用于讀100個寄存器和寫100個寄存器&#xff0c;讀寫分離。 客戶端&am…

物聯網與智慧城市:科技驅動下的城市智能化升級之路

一、引言 隨著科技的不斷進步和城市化進程的加速&#xff0c;物聯網與智慧城市的結合已經成為推動城市智能化升級的關鍵力量。物聯網技術以其強大的連接和數據處理能力&#xff0c;為智慧城市的建設提供了無限可能。本文旨在探討物聯網如何助力智慧城市的構建&#xff0c;以及…

SLAM ORB-SLAM2(21)基礎矩陣的計算和評分

SLAM ORB-SLAM2&#xff08;21&#xff09;基礎矩陣的計算和評分 1. 前言2. 基礎矩陣2.1. 對級約束2.2. 推導2.3. 計算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2&#xff08;20&#xff09;查找基礎矩陣》 中了解到 查找基礎矩陣主要過程&#xff1…

web基礎03-JavaScript

目錄 一、JavaScript基礎 1.變量 2.輸出 3.變量提升 4.區塊 5.JavaScript數據類型 6.查看數值類型 7.undefined和null 8.布爾值 9.和的區別 10.算數/三元/比較/邏輯/賦值運算符 11.特殊字符 12.字符串 &#xff08;1&#xff09;獲取字符串長度 &#xff08;2&am…

備戰藍橋杯Day21 - 堆排序的內置模塊+topk問題

一、內置模塊 在python中&#xff0c;堆排序已經設置好了內置模塊&#xff0c;不想自己寫的話可以使用內置模塊&#xff0c;真的很方便&#xff0c;但是堆排序算法的底層邏輯最好還是要了解并掌握一下的。 使用heapq模塊的heapify()函數將列表轉換為堆&#xff0c;然后使用he…

41、網絡編程/TCP.UDP通信模型練習20240301

一、編寫基于TCP的客戶端實現以下功能&#xff1a; 通過鍵盤按鍵控制機械臂&#xff1a;w(紅色臂角度增大)s&#xff08;紅色臂角度減小&#xff09;d&#xff08;藍色臂角度增大&#xff09;a&#xff08;藍色臂角度減小&#xff09;按鍵控制機械臂 1.基于TCP服務器的機械臂…

Java 創建對象有哪幾種方式

1. 使用new關鍵字&#xff1a;這是最常見和最簡單的創建對象的方式。你可以通過這種方式調用任意的構造函數&#xff0c;無論是無參的還是有參數的構造函數。 例如&#xff1a; Student stu new Student 2. 使用Class類的newInstance方法&#xff08;反射&#xff09; 這種…

Python3零基礎教程之數學運算專題進階

大家好,我是千與編程,今天已經進入我們Python3的零基礎教程的第十節之數學運算專題進階。上一次的數學運算中我們介紹了簡單的基礎四則運算,加減乘除運算。當涉及到數學運算的 Python 3 刷題使用時,進階課程包含了許多重要的概念和技巧。下面是一個簡單的教程,涵蓋了一些常…

勒索軟件類型

勒索軟件類型 加密勒索軟件 它使個人文件和文件夾&#xff08;文檔、電子表格、圖片和視頻&#xff09;被加密。受感染的文件被加密后會被刪除&#xff0c;用戶通常會在當下無法使用的文件的文件夾中看到一個包含付款說明的文本文件。當您嘗試打開其中一個加密文件時,您才可能…

Tomcat負載均衡、動靜分離

目錄 引言 實驗圖解 1.實驗環境搭建 2.部署Nginx服務器及配置靜態頁面Web服務 3.部署Tomcat服務及配置動態頁面Web服務 4.實驗驗收 動態頁面 靜態頁面 引言 tomcat服務既可以處理動態頁面&#xff0c;也可以處理靜態頁面&#xff1b;但其處理靜態頁面的速度遠遠不如…

Oracle SQL優化概念之集群因子解析

導讀 本文介紹一個Oracle 數據庫SQL優化的一個基本概念【集群因子】&#xff0c;理解了此概念&#xff0c;有助于對Oracle數據庫進行SQL優化。 1. 集群因子名詞解析 集群因子&#xff08;ClusteringFactor&#xff09;是如果通過一個索引掃描一張表&#xff0c;需要訪問的表的數…

js優雅的統計字符串字符出現次數

題目如下 統計一串字符串中每個字符出現的頻率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白寫法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

鏈表基礎知識詳解(非常詳細簡單易懂)

概述&#xff1a; 鏈表作為 C 語言中一種基礎的數據結構&#xff0c;在平時寫程序的時候用的并不多&#xff0c;但在操作系統里面使用的非常多。不管是RTOS還是Linux等使用非常廣泛&#xff0c;所以必須要搞懂鏈表&#xff0c;鏈表分為單向鏈表和雙向鏈表&#xff0c;單向鏈表很…

【Vue3】解鎖Vue3黑科技:探索接口、泛型和自定義類型的前端奇跡

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

Android Compose - PlainTooltipBox(已廢棄)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

跨站腳本攻擊xss-labs(1-20)靶機練手

目錄 一、跨站腳本攻擊&#xff08;XSS&#xff09; 1.1 漏洞簡介 1.2:類型 1.3 XSS危害 1.4XSS防御規則 二、環境搭建 三、xsst通關記錄 Level 1&#xff1a;文本解析為 HTML Level 2&#xff1a;htmlspecialchars;input 標簽 value 注入 定義和用法 字符過濾繞過 …