LeetCode:307. 區域和檢索 - 數組可修改(樹狀數組 C++)

目錄

307. 區域和檢索 - 數組可修改

題目描述:

實現代碼與解析:

樹狀數組:

原理思路:


307. 區域和檢索 - 數組可修改

題目描述:

????????給你一個數組?nums?,請你完成兩類查詢。

  1. 其中一類查詢要求?更新?數組?nums?下標對應的值
  2. 另一類查詢要求返回數組?nums?中索引?left?和索引?right?之間(?包含?)的nums元素的??,其中?left <= right

實現?NumArray?類:

  • NumArray(int[] nums)?用整數數組?nums?初始化對象
  • void update(int index, int val)?將?nums[index]?的值?更新?為?val
  • int sumRange(int left, int right)?返回數組?nums?中索引?left?和索引?right?之間(?包含?)的nums元素的??(即,nums[left] + nums[left + 1], ..., nums[right]

示例 1:

輸入:
["NumArray", "sumRange", "update", "sumRange"]
[[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]
輸出:
[null, 9, null, 8]解釋:
NumArray numArray = new NumArray([1, 3, 5]);
numArray.sumRange(0, 2); // 返回 1 + 3 + 5 = 9
numArray.update(1, 2);   // nums = [1,2,5]
numArray.sumRange(0, 2); // 返回 1 + 2 + 5 = 8

提示:

  • 1 <= nums.length <= 3 *?104
  • -100 <= nums[i] <= 100
  • 0 <= index < nums.length
  • -100 <= val <= 100
  • 0 <= left <= right < nums.length
  • 調用?update?和?sumRange?方法次數不大于?3 * 104?

實現代碼與解析:

樹狀數組:

class NumArray {
public:vector<int> tr = vector<int>(1000010);int lowbit(int x) {return x & -x;}int query(int x) {int res = 0;for (int i = x; i > 0; i -= lowbit(i)) res += tr[i];return res;}void add(int x, int u) {for (int i = x; i <= n; i += lowbit(i)) tr[i] += u;}vector<int> nums;int n;NumArray(vector<int>& nums) {n = nums.size();this->nums = nums;// 初始化 樹狀數組tr.resize(n + 1, 0);for (int i = 0; i < n; i++) add(i + 1, nums[i]);}void update(int index, int val) {add(index + 1, val - nums[index]);nums[index] = val;}int sumRange(int left, int right) {return query(right + 1) - query(left);}
};

原理思路:

? ? ? ? 如果沒有更新,用前綴和就行,但是此題數組會改變,如果每次都求一次前綴和一定超時,所以考慮用樹狀數組。

? ? ? ? 樹狀數組代碼十分好寫和簡單,背下來就可以,其具體原理可以自行查閱,理解起來還是挺難的。

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

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

相關文章

Linux輸入設備應用編程(觸摸屏獲取坐標信息)

上一章學習了開發板外接鍵盤并獲取鍵盤的的輸入 Linux輸入設備應用編程&#xff08;鍵盤&#xff0c;按鍵&#xff09;-CSDN博客 本章編寫觸摸屏應用程序&#xff0c;獲取觸摸屏的坐標信息并將其打印出來 目錄 一 觸摸屏數據分析&#xff08;觸摸&#xff0c;點擊&#xff…

采用connector-c++ 8.0操作數據庫

1.下載最新的Connector https://dev.mysql.com/downloads/connector/cpp/&#xff0c;下載帶debug的庫。 解壓縮到本地&#xff0c;本次使用的是帶debug模式的connector庫&#xff1a; 注&#xff1a;其中mysqlcppconn與mysqlcppconn8的區別是&#xff1a; 2.在cmakelist…

請簡要說明 Mysql 中 MyISAM 和 InnoDB 引擎的區別

“請簡要說明 Mysql 中 MyISAM 和 InnoDB 引擎的區別”。 屏幕前有多少同學在面試過程與遇到過類似問題&#xff0c; 可以在評論區留言&#xff1a;遇到過。 考察目的 對于 xxxx 技術的區別&#xff0c;在面試中是很常見的一個問題 一般情況下&#xff0c;面試官會通過這類…

SpringBoot監聽器解析

監聽器模式介紹 監聽器模式的要素 事件監聽器廣播器觸發機制 SpringBoot監聽器實現 系統事件 事件發送順序 監聽器注冊 監聽器注冊和初始化器注冊流程類似 監聽器觸發機制 獲取監聽器列表核心流程: 通用觸發條件: 自定義監聽器實現 實現方式1 實現監聽器接口: Order(1) …

[操作系統]進程和線程

目錄 1.什么是進程 1.1進程控制塊抽象 1.2 CPU 分配 —— 進程調度&#xff08;Process Scheduling&#xff09; 1.3內存分配 —— 內存管理&#xff08;Memory Manage&#xff09; 1.4進程間通信(Inter Process Communication) 2.線程 2.1概念 2.2為什么要有線程 2.3線…

論文閱讀 Forecasting at Scale (二)

最近在看時間序列的文章&#xff0c;回顧下經典 論文地址 項目地址 Forecasting at Scale 3.2、季節性 3.3、假日和活動事件3.4、模型擬合3.5、分析師參與的循環建模4、自動化預測評估4.1、使用基線預測4.2、建模預測準確性4.3、模擬歷史預測4.4、識別大的預測誤差 5、結論6、致…

【Python】重磅!這本30w人都在看的Python數據分析暢銷書更新了!

Python 語言極具吸引力。自從 1991 年誕生以來&#xff0c;Python 如今已經成為最受歡迎的解釋型編程語言。 【文末送書】今天推薦一本Python領域優質數據分析書籍&#xff0c;這本30w人都在看的書&#xff0c;值得入手。 目錄 作譯者簡介主要變動導讀視頻購書鏈接文末送書 pan…

【計算機方向】通信、算法、自動化、機器人、電子電氣、計算機工程、控制工程、計算機視覺~~~~~合集!!!

◆本文為大家梳理了近期可投的EI國際會議&#xff0c;涵蓋計算機各個學科方向&#xff0c;均可EI檢索 本期EI會議匯總合集涵蓋領域&#xff1a;計算機視覺、物聯網、算法、通信、智能技術、人工智能、人機交互、機器人、電子電氣等眾多領域&#xff01; 本期所推薦的EI會議有…

ros2不同機器通訊時IP設置

看到這就是不同機器的IP地址&#xff0c;為了避免在路由器為不同的機器使用DHCP分配到上面的地址&#xff0c;可以設置DHCP分配的范圍&#xff1a;&#xff08;我的路由器是如下設置的&#xff0c;一般路由器型號都不一樣&#xff0c;自己找一下&#xff09; 防火墻設置-----&…

Leetcode—13.羅馬數字轉整數【簡單】

2023每日刷題&#xff08;三十七&#xff09; Leetcode—13.羅馬數字轉整數 算法思想 當前位置的元素比下個位置的元素小&#xff0c;就減去當前值&#xff0c;否則加上當前值 實現代碼 int getValue(char c) {switch(c) {case I:return 1;case V:return 5;case X:return 1…

elasticsearch 8安裝

問題提前報 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的環境是Linux&#xff0c;注意要做以下操作&#xff0c;否則es可能會啟動失敗 1 用編輯工具打開文件/etc/sysctl.conf 2 …

wpf使用CefSharp.OffScreen模擬網頁登錄,并獲取身份cookie

目錄 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取邏輯模擬登錄攔截請求Cookie獲取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

selinux-policy-default(2:2.20231119-2)軟件包內容詳細介紹(2)

接前一篇文章&#xff1a;selinux-policy-default&#xff08;2:2.20231119-2&#xff09;軟件包內容詳細介紹&#xff08;1&#xff09; 4. 重點文件內容解析 &#xff08;1&#xff09;control/postist文件 文件內容如下&#xff1a; #!/bin/sh set -e# summary of how th…

22LLMSecEval數據集及其在評估大模型代碼安全中的應用:GPT3和Codex根據LLMSecEval的提示生成代碼和代碼補全,CodeQL進行安全評估

LLMSecEval: A Dataset of Natural Language Prompts for Security Evaluations 寫在最前面主要工作 課堂討論大模型和密碼方向&#xff08;沒做&#xff0c;只是一個idea&#xff09; 相關研究提示集目標NL提示的建立NL提示的建立流程 數據集數據集分析 存在的問題 寫在最前面…

力扣算法練習BM45—滑塊窗口的最大值

題目 給定一個長度為 n 的數組 num 和滑動窗口的大小 size &#xff0c;找出所有滑動窗口里數值的最大值。 例如&#xff0c;如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3&#xff0c;那么一共存在6個滑動窗口&#xff0c;他們的最大值分別為{4,4,6,6,6,5}&#xff1b; 針…

使用Python畫一棵樹

&#x1f38a;專欄【不單調的代碼】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 &#x1f970;歡迎并且感謝大家指出我的問題 文章目錄 &#x1f339;Turtle模塊&#x1f384;效果&#x1f33a;代碼&#x1f6f8;代碼…

【tomcat】java.lang.Exception: Socket bind failed: [730048

項目中一些舊工程運行情況處理 問題 1、啟動端口占用 2、打印編碼亂碼 ??&#xfffd;&#xfffd; 13, 2023 9:33:26 &#xfffd;&#xfffd;&#xfffd;&#xfffd; org.apache.coyote.AbstractProtocol init &#xfffd;&#xfffd;&#xfffd;&#xfffd;: Fa…

五毛QQ項目記

問題與挑戰&#xff1a;某公司為了實現某馬總造福全人類&#xff0c;紅旗插遍全球的宏偉目標&#xff0c;為應對后續用戶量激增的問題。特別安排了一次針對全體用戶的秒殺活動&#xff1a;于XXXX年XX月XX日XX時XX分XX秒開始的秒殺五毛錢一百個QQ幣的活動。每個賬戶僅限一次&…

oracle面試相關的,Oracle基本操作的SQL命令

文章目錄 數據庫-Oracle〇、Oracle用戶管理一、Oracle數據庫操作二、Oracle表操作1、創建表2、刪除表3、重命名表4、增加字段5、修改字段6、重名字段7、刪除字段8、添加主鍵9、刪除主鍵10、創建索引11、刪除索引12、創建視圖13、刪除視圖 三、Oracle操作數據1、數據查詢2、插入…