《哈希表》K倍區間(解題報告)

文章目錄

    • 零、題目描述
    • 一、算法概述
    • 二、算法思路
    • 三、代碼實現
    • 四、算法解釋
    • 五、復雜度分析

零、題目描述

題目鏈接:K倍區間
在這里插入圖片描述

一、算法概述

??計算子數組和能被k整除的子數組數量的算法。通過前綴和與哈希表的結合,高效地統計滿足條件的子數組。
??需要注意的是,題目要求求的是 k 的非負整數倍,而非整數倍,所以哈希表的值光存儲次數是不夠的,需要維護一個列表,在枚舉到第 i 個元素的時候,在哈希表 hashset[ sum[i]%k ] 的所有列表元素中,統計小于等于 sum[i] 的元素個數進行累加,因為只有小于等于 sum[i] 的值才能保證是 非負整數 倍。

二、算法思路

  1. 前綴和數組:計算數組的前綴和數組sum,其中sum[i]表示前i個元素的和。
  2. 哈希表與多重集合:使用哈希表hashset,鍵為前綴和模k的余數,值為對應的前綴和的多重集合。
  3. 余數處理:對于每個前綴和sum[i],計算其模k的余數s,并處理可能的負數余數情況。
  4. 查詢與統計:在哈希表中查找余數為s的前綴和集合,并統計其中小于當前前綴和的元素數量,累加到結果中。
  5. 更新哈希表:將當前前綴和插入到對應的余數集合中。

三、代碼實現

#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;
long long sum[100001];int main()
{int n, k;cin >> n >> k;for(int i = 1; i <= n; ++i) {int x;cin >> x;sum[i] = sum[i-1] + x;}long long ans = 0;unordered_map<int, multiset<long long> > hashset;hashset[0].insert(0);for(int i = 1; i <= n; ++i) {int s = sum[i] % k;s = (s + k) % k;int cnt = distance(hashset[s].begin(),hashset[s].upper_bound(sum[i]));ans += cnt;hashset[s].insert(sum[i]);}cout << ans << endl;return 0;
}

四、算法解釋

  1. 輸入處理:讀取數組長度n和除數k,然后讀取數組元素并計算前綴和數組。
  2. 初始化:初始化結果變量ans0,并在哈希表中插入初始值(0, 0),處理空數組的情況。
  3. 遍歷前綴和數組
    • 計算當前前綴和模k的余數s,并處理負數余數。
    • 在哈希表中查找余數為s的前綴和集合,統計其中小于當前前綴和的元素數量(注意注意!這題的核心在這里,要求的是非負整數倍,所以必須要找集合中 小于 當前 sum[i] 的元素值,利用二分去找hashset[s].upper_bound(sum[i]))。
    • 將當前前綴和插入到對應的余數集合中。
  4. 輸出結果:輸出滿足條件的子數組數量。

五、復雜度分析

  1. 時間復雜度:隨機數據是 O ( n l o g n ) O(n log n) O(nlogn) 的,如果可以構造數據,會達到 O ( n 2 ) O(n^2) O(n2),本題數據較弱。
  2. 空間復雜度 O ( n ) O(n) O(n)。主要用于存儲前綴和數組和哈希表。

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

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

相關文章

OpenShift 在 Kubernetes 多出的功能中,哪些開源?

OpenShift 在 Kubernetes 基礎上增加的功能中&#xff0c;部分組件是開源的&#xff08;代碼可公開訪問&#xff09;&#xff0c;而另一些則是 Red Hat 專有&#xff08;閉源&#xff09;。以下是詳細分類&#xff1a; 1. 完全開源的功能&#xff08;代碼可查&#xff09; 這些…

【每天一個知識點】CITE-seq 技術

一、技術背景 單細胞RNA測序&#xff08;scRNA-seq&#xff09;自問世以來&#xff0c;極大推動了細胞異質性和組織復雜性的研究。但RNA水平并不能完全代表蛋白質水平&#xff0c;因為蛋白質的表達受轉錄后調控、翻譯效率及蛋白降解等多種因素影響。此外&#xff0c;許多細胞類…

中文Windows系統下程序輸出重定向亂碼問題解決方案

導言 最近我在用 Rust 開發時&#xff0c;遇到了一個讓人頭疼的問題&#xff1a;運行 cargo run -- version Cargo.toml > output.txt 將輸出重定向到文件后&#xff0c;打開 output.txt 卻發現里面全是亂碼&#xff01;我的程序確實是UTF8但是輸出的文件卻是UTF16LE編碼的…

Python管理工具UV

常用 UV 命令 安裝 pip install uv 版本相關 uv python list 打印所有uv支持的python版本uv python install cpython-3.12 安裝指定的python版本uv run -p 3.12 test.py 用指定的python版本運行python代碼uv run -p 3.12 python 進入python執行環境。假如輸入的版本是一個本…

論文略讀:ASurvey on Intent-aware Recommender Systems

202406 arxiv 推薦系統在許多現代在線服務中發揮著關鍵作用&#xff0c;例如電子商務或媒體流服務&#xff0c;它們能夠為消費者和服務提供商創造巨大的價值。因此&#xff0c;過去幾十年來&#xff0c;研究人員提出了大量生成個性化推薦的技術方法。傳統算法——從早期的 Gro…

Neo4j 中存儲和查詢數組數據的完整指南

Neo4j 中存儲和查詢數組數據的完整指南 圖形數據庫 Neo4j 不僅擅長處理節點和關系&#xff0c;還提供了強大的數組(Array)存儲和操作能力。本文將全面介紹如何在 Neo4j 中高效地使用數組&#xff0c;包括存儲、查詢、優化以及實際應用場景。 數組在 Neo4j 中的基本使用 數組…

Android 編譯和打包image鏡像流程

1. 編譯命令 source build/envsetup.sh lunch aosp_car_arm64-userdebug make2. 編譯流程 source build/envsetup.sh 定義一些函數的環境變量&#xff0c;如 lunchvalidate_current_shell&#xff0c;確認 shell 環境set_global_paths&#xff0c;設置環境變量 ANDROID_GLOB…

MySQL:SQL 慢查詢優化的技術指南

1、簡述 在 Java 后端開發中&#xff0c;數據庫是系統性能瓶頸的高發地帶&#xff0c;而 慢 SQL 查詢 往往是系統響應遲緩的“罪魁禍首”。本文將全面梳理慢 SQL 的優化思路&#xff0c;并結合 Java 示例進行實戰演練。 2、慢查詢的常見表現 慢查詢通常表現為&#xff1a; 接…

leetcode543-二叉樹的直徑

leetcode 543 思路 路徑長度計算&#xff1a;任意兩個節點之間的路徑長度&#xff0c;等于它們的最低公共祖先到它們各自的深度之和遞歸遍歷&#xff1a;通過后序遍歷&#xff08;左右根&#xff09;計算每個節點的左右子樹深度&#xff0c;并更新全局最大直徑深度與直徑的關…

詳解main的參數并實現讀取文件

在 C 語言中&#xff0c;main函數的參數argc和argv用于接收命令行傳入的參數 main 函數的兩個參數 int main(int argc, char* argv[]) 假設顧客通過手機 APP 點餐&#xff0c;訂單信息會被傳遞給餐廳的處理系統&#xff08;也就是你的程序&#xff09;。 訂單信息結構 argc…

c++IO類

概述 c不直接處理輸入輸出&#xff0c;而是通過定義在標準類庫中的類來處理IO。這些類支持從設備讀取數據&#xff0c;向設備寫入數據的IO操作&#xff0c;設備可以是文件、控制臺窗口等。還可以從內存IO。 IO類 iostream: istream&#xff0c;wistreamostream&#xff0c;wo…

springboot的后端處理HTML的頁面請求

下面是一個完整的 Spring Boot 后端示例&#xff0c;用于接收 <form> 提交的文件上傳請求&#xff08;/article/uploadLifeImage 接口&#xff09;&#xff0c;并將上傳的文件保存到本地目錄。 ? 一、項目結構 upload-demo/ ├── src/ │ └── main/ │ ├…

深入探究 Go 語言中使用 SQLite 數據庫

引言 在軟件開發中&#xff0c;數據庫是管理和存儲數據的關鍵組件。SQLite 作為一款輕量級的嵌入式數據庫&#xff0c;因其零配置、高性能和易于集成等特性&#xff0c;成為眾多小型項目和嵌入式系統的理想選擇。而 Go 語言以其高效、簡潔的特點&#xff0c;為操作 SQLite 數據…

Portable Computer Power Adapter

Portable Computer Power Adapter 筆記本電源適配器&#xff0c;將220伏特的交流電轉化直流電 現在的適配器真的體積之大&#xff0c;讓我無法理解&#xff0c;本來便攜計算機為了方便減少體積重量&#xff0c;現在都倒反天罡了。讓我無法理解設計師是怎么干出來的。這玩意有2…

Uniapp 網絡請求封裝專題

目錄 一、前言 二、uniapp官方文檔 三、舉例演示 3.1 使用說明 3.2 Content-Type 3.2.1 ??基本概念 ??3.2.2 核心作用 3.2.3 常見 Content-Type 類型及使用場景 1&#xff09;文本類 a&#xff09;text/plain???? b&#xff09;text/html?? 2&#xf…

2025年滲透測試面試題總結-2025年HW(護網面試) 07(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 07 一、OWASP Top 10 2023核心漏洞 二、XSS竊取Cookie全流程 三、滲透測試五階段模型…

Seata分布式事務解決框架

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一個開源的分布式事務解決方案&#xff0c;旨在幫助開發者更容易地在微服務架構中解決分布式事務問題。 你可以把它理解為一個工具箱&#xff0c;專門用來處理微服務之間操作的一致性。…

舊物回收小程序開發:開啟綠色生活新方式

在環保理念日益深入人心的今天&#xff0c;每一件舊物都承載著資源再生的無限可能。我們精心打造的舊物回收小程序&#xff0c;宛如一把神奇的鑰匙&#xff0c;為你開啟綠色生活新方式&#xff01; 想象一下&#xff0c;家中堆積如山的舊衣物、閑置的電子產品、廢棄的書籍雜志…

STM32 串口通信②:藍牙模塊HC-05控制單片機

一 前言 上一篇我們已經成功實現單片機和電腦的連接&#xff0c;接下來&#xff0c;我們學習一個有趣的板塊&#xff0c;HC-05藍牙模塊&#xff0c;這個藍牙模塊&#xff0c;我們就要建立手機和單片機的通訊啦&#xff0c;還是比較有趣的一個過程&#xff0c;大家可以跟著多操作…

【Verilog】Verilator的TestBench該用C++還是SystemC

Verilator的Testbench&#xff08;測試平臺&#xff09;主要使用 C 或 SystemC 來編寫。這是由Verilator的工作原理決定的&#xff1a;它將你的Verilog/SystemVerilog設計轉換成一個C類&#xff0c;因此你需要一個C環境來實例化和驅動這個類。 下面詳細說明這兩種方式以及如何…