LeetCode 1524. 和為奇數的子數組數目

好的!讓我們詳細解釋 LeetCode 1524. 和為奇數的子數組數目 這道題的思路和解法。

題目: https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/

題目分析

問題描述
給定一個整數數組 arr,返回其中和為奇數的子數組的數目。由于答案可能很大,結果需對 10^9 + 7 取余。

示例
輸入:arr = [1, 3, 5]
輸出:4
解釋:

  • 子數組 [1][3][5] 的和均為奇數。
  • 子數組 [1, 3, 5] 的和為 1 + 3 + 5 = 9,也是奇數。

暴力解法(超時)

思路
枚舉所有子數組,計算每個子數組的和并判斷奇偶性。

代碼

class Solution {
public:int numOfSubarrays(vector<int>& arr) {const int MOD = 1e9 + 7;int count = 0;int n = arr.size();for (int i = 0; i < n; i++) {int sum = 0;for (int j = i; j < n; j++) {sum += arr[j];if (sum % 2 == 1) {count = (count + 1) % MOD;}}}return count;}
};

復雜度

  • 時間復雜度:O(n2)
  • 空間復雜度:O(1)

優化解法:前綴和 + 奇偶計數

核心思路

  1. 前綴和的奇偶性:子數組 [i, j] 的和為 prefix[j+1] - prefix[i],其中 prefix[k] 表示前 k 個元素的和。
  2. 奇偶性規律:若 prefix[j+1]prefix[i] 的奇偶性不同,則子數組和為奇數。
  3. 哈希表統計:動態維護前綴和為奇數和偶數的次數,遍歷數組時累加符合條件的子數組數目。

代碼

class Solution {
public:int numOfSubarrays(vector<int>& arr) {const int MOD = 1e9 + 7;int count = 0;int prefix = 0;      // 當前前綴和int odd = 0;         // 前綴和為奇數的次數int even = 1;        // 前綴和為偶數的次數(初始包含前綴和為0的情況)for (int num : arr) {prefix += num;if (prefix % 2 == 0) {// 當前前綴和為偶數,加上之前前綴和為奇數的次數count = (count + odd) % MOD;even++;} else {// 當前前綴和為奇數,加上之前前綴和為偶數的次數count = (count + even) % MOD;odd++;}}return count;}
};

復雜度

  • 時間復雜度:O(n)
  • 空間復雜度:O(1)

詳細解釋

  1. 前綴和的奇偶性
    對于子數組 [i, j],其和為 prefix[j+1] - prefix[i]

    • prefix[j+1] 為偶數,prefix[i] 為奇數,則和為奇數。
    • prefix[j+1] 為奇數,prefix[i] 為偶數,則和為奇數。
  2. 動態維護奇偶次數

    • odd:記錄遍歷到當前位置時,前綴和為奇數的次數。
    • even:記錄遍歷到當前位置時,前綴和為偶數的次數。
    • 初始值even = 1,因為空數組的前綴和為 0(偶數)。
  3. 累加結果

    • 若當前前綴和為偶數,則它可以與之前所有奇數前綴和形成有效子數組,累加 odd
    • 若當前前綴和為奇數,則它可以與之前所有偶數前綴和形成有效子數組,累加 even

示例驗證

輸入:arr = [1, 3, 5]
步驟如下:

  1. 初始狀態prefix = 0odd = 0even = 1count = 0
  2. 處理 1prefix = 1(奇數),count += even = 1odd = 1even = 1
  3. 處理 3prefix = 4(偶數),count += odd = 1 + 1 = 2odd = 1even = 2
  4. 處理 5prefix = 9(奇數),count += even = 2 + 2 = 4odd = 2even = 2

最終結果:4,與預期一致。

總結

通過前綴和的奇偶性分析和動態計數,我們將時間復雜度從 O(n2) 優化到 O(n),空間復雜度為 O(1)。這種方法適用于所有類似的“子數組和滿足某種奇偶性條件”的問題,核心在于利用前綴和的奇偶性快速查找配對。

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

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

相關文章

kafka學習筆記(三、消費者Consumer使用教程——消費性能多線程提升思考)

1.簡介 KafkaConsumer是非線程安全的&#xff0c;它定義了一個acquire()方法來檢測當前是否只有一個線程在操作&#xff0c;如不是則會拋出ConcurrentModifcationException異常。 acquire()可以看做是一個輕量級鎖&#xff0c;它僅通過線程操作計數標記的方式來檢測線程是否發…

百度蜘蛛池的作用是什么?技術@baidutopseo

百度蜘蛛池的作用 百度蜘蛛池是一種用于集中管理和調度百度搜索引擎蜘蛛&#xff08;爬蟲&#xff09;的技術工具。其主要目的是優化網站內容的收錄效率&#xff0c;幫助搜索引擎更高效地發現和抓取網頁內容。技術baidutopseo 提升收錄效率 通過集中大量百度蜘蛛的訪問請求&…

黑馬Java面試筆記之 消息中間件篇(Kafka)

一. Kafka保證消息不丟失 Kafka如何保證消息不丟失 使用Kafka在消息的收發過程中都會出現消息丟失&#xff0c;Kafka分別給出了解決方案 生產者發送消息到Brocker丟失消息在Brocker中存儲丟失消費者從Brocker接收消息丟失 1.1 生產者發送消息到Brocker丟失 設置異步發送 消息…

dis css port brief 命令詳細解釋

華為交換機命令 display css port brief 詳細解釋 display css port brief 是華為交換機中用于 快速查看堆疊&#xff08;CSS&#xff0c;Cluster Switch System&#xff09;端口狀態及關鍵參數 的命令&#xff0c;適用于日常運維、堆疊鏈路健康檢查及故障定位。以下是該命令的…

Redis 緩存問題及其解決方案

1. 緩存雪崩 概念&#xff1a;緩存雪崩是指在緩存層出現大范圍緩存失效或緩存服務器宕機的情況下&#xff0c;大量請求直接打到數據庫&#xff0c;導致數據庫壓力驟增&#xff0c;甚至可能引發數據庫宕機。 影響&#xff1a;緩存雪崩會導致系統性能急劇下降&#xff0c;甚至導…

使用Python進行函數作畫

前言 因為之前通過deepseek繪制一下卡通的人物根本就不像&#xff0c;又想起來之前又大佬通過函數繪制了一些圖像&#xff0c;想著能不能用Python來實現&#xff0c;結果發現可以&#xff0c;不過一些細節還是需要自己調整&#xff0c;deepseek整體的框架是沒有問題&#xff0…

關于list集合排序的常見方法

目錄 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、進階排序技巧 4.1 空值安全處理 4.2 多字段組合排序 4.3. 逆序 5、性能優化建議 5.1 并行流加速 5.2 原地排序 6、最佳實踐 7、注意事項 前言 Java中對于集合的排序操作&#xff0c;分別為list.s…

Java高級 | (二十二)Java常用類庫

參考&#xff1a;Java 常用類庫 | 菜鳥教程 一、核心Java類庫 二、常用第三方庫 以下是 Java 生態系統中廣泛使用的第三方庫&#xff1a; 類別庫名稱主要功能官方網站JSON 處理JacksonJSON 序列化/反序列化https://github.com/FasterXML/jacksonGsonGoogle 的 JSON 庫https:…

幾種常用的Agent的Prompt格式

一、基礎框架范式&#xff08;Google推薦標準&#xff09; 1. 角色與職能定義 <Role_Definition> 你是“項目專家”&#xff08;Project Pro&#xff09;&#xff0c;作為家居園藝零售商的首席AI助手&#xff0c;專注于家裝改造領域。你的核心使命&#xff1a; 1. 協助…

蛋白質結構預測軟件openfold介紹

openfold 是一個用 Python 和 PyTorch 實現的 AlphaFold2 的開源復現版&#xff0c;旨在提升蛋白質結構預測的可復現性、可擴展性以及研究友好性。它允許研究者在不開源 DeepMind 原始代碼的情況下&#xff0c;自由地進行蛋白結構預測的訓練和推理&#xff0c;并支持自定義模型…

AD轉嘉立創EDA

可以通過嘉立創文件遷移助手進行格式的轉換 按照它的提示我們整理好文件 導出后是這樣的&#xff0c;第一個文件夾中有原理圖和PCB&#xff0c;可以把它們壓縮成一個壓縮包 這個時候我們打開立創EDA&#xff0c;選擇導入AD 這樣就完成了

MySQL(50)如何使用UNSIGNED屬性?

在 MySQL 中&#xff0c;UNSIGNED 屬性用于數值數據類型&#xff08;如 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT&#xff09;&#xff0c;表示該列只能存儲非負整數。使用 UNSIGNED 屬性可以有效地擴展列的正整數范圍&#xff0c;因為它不需要為負數保留空間。 1. 定義與…

什么是鏈游,鏈游系統開發價格以及方案

2025 Web3錢包開發指南&#xff1a;從多版本源碼到安全架構實戰 在數字資產爆發式增長的今天&#xff0c;Web3錢包已成為用戶進入鏈上世界的核心入口。作為開發者&#xff0c;如何高效構建安全、跨鏈、可擴展的錢包系統&#xff1f;本文結合前沿技術方案與開源實踐&#xff0c…

文件IO流

IO使用函數 標準IO文件IO(低級IO)打開fopen, freopen, fdopenopen關閉fcloseclose讀getc, fgetc, getchar, fgets, gets, fread printf fprintfread寫putc, fputc, putchar, fputs, puts, fwrite scanf fscanfwrite操作文件指針fseeklseek其它fflush rewind ftell 文件描述符 …

云原生DMZ架構實戰:基于AWS CloudFormation的安全隔離區設計

在云時代,傳統的DMZ(隔離區)概念已經演變為更加靈活和動態的架構。本文通過解析一個實際的AWS CloudFormation模板,展示如何在云原生環境中構建現代化的DMZ安全架構。 1. 云原生DMZ的核心理念 傳統DMZ是網絡中的"緩沖區",位于企業內網和外部網絡之間。而在云環境…

一、虛擬貨幣概述

1. 定義 - 虛擬貨幣是一種基于網絡技術、加密技術和共識機制的數字貨幣&#xff0c;它不依賴傳統金融機構發行&#xff0c;而是通過計算機算法生成&#xff0c;例如比特幣、以太坊等。 2. 特點 - 去中心化&#xff1a;沒有一個單一的機構或個人控制整個虛擬貨幣系統&#xff0c…

Make All Equal

給定一個循環數組 a1,a2,…,ana1?,a2?,…,an?。 你可以對 aa 至多執行 n?1n?1 次以下操作&#xff1a; 設 mm 為 aa 的當前大小&#xff0c;你可以選擇任何兩個相鄰的元素&#xff0c;其中前一個不大于后一個&#xff08;特別地&#xff0c;amam? 和 a1a1? 是相鄰的&a…

任務中心示例及瀏覽器強制高效下載實踐

1. 效果展示 這里的進度展示&#xff0c;可以通過我們之前講到的Vue3實現類ChatGPT聊天式流式輸出(vue-sse實現) SSE技術實現&#xff0c;比如用戶點擊全量下載時&#xff0c;后臺需要將PDF文件打包為ZIP文件&#xff0c;由于量較大&#xff0c;需要展示進度&#xff0c;用戶點…

SpringBoot整合Flowable【08】- 前后端如何交互

引子 在第02篇中&#xff0c;我通過 Flowable-UI 繪制了一個簡單的績效流程&#xff0c;并在后續章節中基于這個流程演示了 Flowable 的各種API調用。然而&#xff0c;在實際業務場景中&#xff0c;如果要求前端將用戶繪制的流程文件發送給后端再進行解析處理&#xff0c;這種…

2025 Java面試大全技術文章大綱

2025 Java面試大全技術文章大綱 基礎篇 Java核心語法 數據類型與包裝類自動裝箱與拆箱原理String、StringBuffer、StringBuilder區別final關鍵字作用場景 面向對象特性 多態的實現機制抽象類與接口的異同設計模式&#xff1a;單例的七種寫法泛型擦除與橋接方法 進階篇 J…