前綴和計算

前綴和

輸入一個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l, r。對于每個詢問,輸出原序列中從第l個數到第r個數的和。

所用方法和基本原理

  1. 前綴和數組的構建
    • 首先定義了一個方法getPrefixSum來構建前綴和數組。前綴和數組s的作用是記錄原數組arr從起始位置到當前位置的所有元素之和。
    • 初始化s[0] = 0,這是因為前綴和從數組的起始位置開始累加,起始位置之前沒有元素,和為0。
    • 通過遍歷原數組arr,從索引1開始,計算s[m] = s[m - 1] + arr[m],即當前位置的前綴和等于前一個位置的前綴和加上當前位置的數組元素。這樣,前綴和數組s中的每個元素s[i]都表示原數組arr中從arr[0]arr[i]的所有元素之和。
  2. 區間和的計算
    • 對于每個詢問的區間[l, r],通過已經構建好的前綴和數組s來計算區間和。公式為s[r] - s[l] + arr[l]
    • s[r]表示從原數組起始位置到位置r的所有元素之和,s[l]表示從原數組起始位置到位置l - 1的所有元素之和(因為前綴和數組的索引從0開始)。所以s[r] - s[l]得到的是從arr[l + 1]arr[r]的和,再加上arr[l],就得到了從arr[l]arr[r]的和。

代碼及注釋

import java.util.Scanner;public class RangeSumQuery {// 構建前綴和數組public static int[] getPrefixSum(int[] arr) {int[] s = new int[arr.length];s[0] = 0;for (int m = 1; m < arr.length; m++) {s[m] = s[m - 1] + arr[m];}return s;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}int m = sc.nextInt();// 獲取前綴和數組int[] s = getPrefixSum(arr);for (int i = 0; i < m; i++) {int l = sc.nextInt();int r = sc.nextInt();// 計算并輸出區間和int res = s[r] - s[l] + arr[l];System.out.println(res);}sc.close();}
}

舉例說明

假設原整數序列為arr = [1, 3, 5, 7, 9],有3個詢問,分別為(1, 3)(0, 2)(2, 4)

  1. 構建前綴和數組
    • s[0] = 0
    • s[1] = s[0] + arr[1] = 0 + 3 = 3
    • s[2] = s[1] + arr[2] = 3 + 5 = 8
    • s[3] = s[2] + arr[3] = 8 + 7 = 15
    • s[4] = s[3] + arr[4] = 15 + 9 = 24。所以前綴和數組s = [0, 3, 8, 15, 24]
  2. 計算詢問的區間和
    • 對于詢問(1, 3)
      • l = 1r = 3res = s[3] - s[1] + arr[1] = 15 - 3 + 3 = 15
    • 對于詢問(0, 2)
      • l = 0r = 2res = s[2] - s[0] + arr[0] = 8 - 0 + 1 = 9
    • 對于詢問(2, 4)
      • l = 2r = 4res = s[4] - s[2] + arr[2] = 24 - 8 + 5 = 21

方法的優劣

  1. 時間復雜度
    • 預處理階段:構建前綴和數組的時間復雜度為 O ( n ) O(n) O(n),其中 n n n是原數組的長度,因為需要遍歷原數組一次。
    • 查詢階段:對于 m m m個查詢,每個查詢的時間復雜度為 O ( 1 ) O(1) O(1),因為只需要進行簡單的數組訪問和加減法運算。所以總的時間復雜度為 O ( n + m ) O(n + m) O(n+m)。相比每次查詢都遍歷區間內所有元素的暴力解法(時間復雜度為 O ( m × n ) O(m \times n) O(m×n)),當前方法在處理多個查詢時效率有顯著提升。
  2. 空間復雜度
    • 需要額外的空間來存儲前綴和數組,空間復雜度為 O ( n ) O(n) O(n),因為前綴和數組的長度與原數組長度相同。

優點

  • 對于多次查詢區間和的場景,效率較高,大大降低了時間復雜度。
  • 實現相對簡單,容易理解和編碼。

缺點

  • 需要額外的空間來存儲前綴和數組,如果原數組非常大,可能會占用較多內存。
  • 當原數組頻繁變動時,每次變動后都需要重新計算前綴和數組,維護成本較高。

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

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

相關文章

BP神經網絡支持向量機實現風機故障診斷

BP神經網絡&#xff0c;支持向量機等用于風機故障診斷 BP神經網絡&#xff0c;支持向量機等用于風機故障診斷/成功算法/bp20111202_FDD.m , 1580 BP神經網絡&#xff0c;支持向量機等用于風機故障診斷/成功算法/BP_FDD.m , 6044 BP神經網絡&#xff0c;支持向量機等用于風機故…

c++ std::initializer_list

測試代碼&#xff1a; int sum(std::initializer_list<int> params) { // 傳遞若干同類型參數int total 0;for (auto num : params) {total num;}return total; }void testInitializer_list() {// 自定義類支持列表初始化class Demo {public:Demo(std::initializer_li…

Python 數據分析與機器學習入門 (五):Matplotlib 數據可視化基礎

引言&#xff1a;為何可視化至關重要&#xff1f; 俗話說&#xff0c;“一圖勝千言”。在數據分析領域&#xff0c;這句話尤其正確。原始的數據表格和統計摘要雖然精確&#xff0c;但往往難以揭示數據中隱藏的模式、趨勢、異常值和關系。數據可視化通過將數據轉換成圖形&#…

AI基礎1--線性代數(TODO)

1 前言 關于矩陣的運算&#xff0c;其實之前寫過一篇&#xff1a;算法矩陣提速原理_矩陣分塊計算速度會更快嘛-CSDN博客 還是那句話&#xff0c;計算機懂個毛的高等數學。只是矩陣運算的并行性和結構化特點與 SIMD/GPU 的執行模型非常一致。在實際硬件實現中&#xff0c;許多矩…

如何讓宿主機完全看不到Wi-Fi?虛擬機獨立聯網隱匿上網實戰!

“如何讓宿主機完全看不到Wi-Fi&#xff1f;虛擬機獨立聯網隱匿上網實戰&#xff01;” 一、前言 在某些特定環境&#xff08;如企業辦公或信息安全測試&#xff09;中&#xff0c;我們可能有這樣的需求&#xff1a; 讓宿主機無法識別或使用某個USB網絡設備&#xff0c;但虛擬…

Excel基礎操作知識筆記

? 學習視頻鏈接&#xff1a; ??????【公開課】Excel基礎大全&#xff08;1-66集&#xff09;【超高清版】_嗶哩嗶哩_bilibili 深圳則秀教育官方賬號的個人空間-深圳則秀教育官方賬號個人主頁-嗶哩嗶哩視頻 Excel技巧零基礎入門公開課小白&#xff08;Excel表格制作|Exc…

【2025/06/30】GitHub 今日熱門項目

GitHub 今日熱門項目 &#x1f680; 每日精選優質開源項目 | 發現優質開源項目&#xff0c;跟上技術發展趨勢 &#x1f4cb; 報告概覽 &#x1f4ca; 統計項&#x1f4c8; 數值&#x1f4dd; 說明&#x1f4c5; 報告日期2025-06-30 (周一)GitHub Trending 每日快照&#x1f55…

Oracle 進階語法實戰:從多維分析到數據清洗的深度應用?(第四課)

在《Oracle 樹形統計再進階》(第三課)基礎上&#xff0c;我們跳出傳統 SQL 聚合框架&#xff0c;探索Oracle 特有的高級語法特性&#xff0c;包括多維分析神器MODEL子句、數據清洗利器正則表達式、PL/SQL 存儲過程優化&#xff0c;以及基于執行計劃的查詢調優技巧。這些技術能解…

SpringBoot -- 自動配置原理

SpringBoot 自動配置原理 基礎知識 Bean掃描 我們在學習 Spring 的時候&#xff0c;如果要把標注一下注解的類掃描進 IOC 容器 Controller&#xff0c;Service&#xff0c;Mapper&#xff0c;是需要通過一下兩種方式實現的&#xff0c;但是我們在 SpringBoot 工程中并沒有編寫…

Kubernetes從入門到精通-服務發現Service

一、為什么需要 Service&#xff1f; Pod 的動態性&#xff1a; Pod 是 Kubernetes 調度的基本單位。它們可能因為故障、滾動更新、擴縮容等原因隨時被創建或銷毀。 Pod IP 的不穩定性&#xff1a; 每個 Pod 都有自己的 IP 地址&#xff0c;但當 Pod 重建時&#xff0c;IP 地址…

Milvus 資源調度系統的核心部分:「查詢節點」「資源組」「數據庫」

Milvus 的資源管理分為三層&#xff1a;查詢節點、資源組和 數據庫。 查詢節點&#xff1a;處理查詢任務的組件。它在物理機或容器&#xff08;如 Kubernetes 中的 pod&#xff09;上運行。 資源組&#xff1a;查詢節點的集合&#xff0c;充當邏輯組件&#xff08;數據庫和 C…

我的第一個開源項目:用Python搭建輕量級靜態網頁服務器—— 零基礎也能實現的Web開發初體驗

一、為什么選擇靜態服務器&#xff1f; 極簡高效&#xff1a;無需數據庫或復雜后端邏輯&#xff0c;適合展示簡歷、作品集等靜態內容 學習曲線平緩&#xff1a;是理解HTTP協議和Web服務原理的最佳入門方式 資源消耗低&#xff1a;單文件Python腳本即可運行&#xff0c;內存占…

github 圖床使用免費CDN加速(jsdelivr)

github做圖床大部分人都知道&#xff0c;但是國內訪問速度不穩定&#xff0c;所以使用jsdelivr加速。 jsdelivr是什么呢&#xff1f;它是一個免費、快速和可信賴的CDN加速服務&#xff0c;直接集成在github中的&#xff0c;無需額外操作即可使用。 本文分兩部份&#xff0c;最…

lte高階調制和AMC

文章目錄 LTE高階調制AMC LTE高階調制 首先什么是調制?調制是把通信系統中的基帶信號&#xff08;低頻&#xff09;轉化成適合信道傳輸的高頻信號的過程。 波長&#xff08;λ&#xff09;與頻率&#xff08;f&#xff09; 基本關系&#xff1a; λc/f&#xff0c;λc/f&…

shardingsphere5.2.1與SpringBoot3.X的版本沖突問題

1.先說一下我的版本配置與遇到的問題 問題產生的依賴和版本&#xff1a; 主要依賴依賴版本jdk17SpringBoot 3.3.13shardingsphere-jdbc 5.2.1 問題產生的原因&#xff1a; 主要就是shardingsphere-jdbc 與SpringBoot版本沖突&#xff0c;因為Spring Boot 需要 SnakeYAML 庫來解…

FPGA控制88E1512 PHY芯片完成網絡通信

一、88E1512分析 本文不對88E1512進行詳細解析&#xff0c;僅對調試過程中重點使用的幾個寄存器進行說明。 1.1 MDIO時序分析 根據手冊&#xff0c;MDIO時序中&#xff0c;mdc時鐘最高為12Mhz。占空比和建立保持時間要求可以觀察上述表格。 MDIO的讀數據時序圖如下&#xff1a…

Ai大模型 - ocr圖像識別形成結構化數據(pp-ocr+nlp結合) 以及訓練微調實現方案(初稿)

全局目錄,一步到位 功能流程第一階段 基于現有條件進行 調研,測試與評估1.1 ocr深度學習模型 pp-ocr1.2 nlp結構化模型1.3 硬件要求: 第二階段 模型訓練微調2.1 更換ocr-GPU模型, 下載相關環境2.2 nlp模型 語義訓練2.3 最低硬件要求:2.4 樣本數據: (重點)2.5 進一步增強模型能力…

【Linux】軟硬鏈接,動靜態庫

目錄 一、認識一下常用指令 1、建立一個軟鏈接 2、建立一個硬鏈接 3、刪除文件的第二種方式&#xff1a;刪除鏈接unlink指令 二、什么是硬鏈接&#xff1f; 三、軟硬鏈接的原理&#xff1a; 四、應用場景 1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行…

VRR(可變刷新率)和QMS(快速媒體切換)

&#x1f527; 一、技術原理的本質區別 技術VRR (可變刷新率)QMS (快速媒體切換)核心目標消除動態幀率波動導致的畫面撕裂/卡頓消除靜態幀率切換時的黑屏中斷工作機制實時調整顯示器刷新率&#xff08;Hz&#xff09;匹配GPU輸出幀率&#xff08;FPS&#xff09;→ 動態延長/縮…

GO 語言學習 之 Map

map 是 Go 語言中非常重要的數據結構&#xff0c;常用于需要快速查找、統計或分組數據的場景。 map定義&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 創建一個 mapm2 : make(map[int]string) // 創建一個 map m3…