LeetCode刷題--- 乘積為正數的最長子數組長度

個人主頁:元清加油_【C++】,【C語言】,【數據結構與算法】-CSDN博客

個人專欄

力扣遞歸算法題

?http://t.csdnimg.cn/yUl2I

【C++】? ??

??????http://t.csdnimg.cn/6AbpV

數據結構與算法

????http://t.csdnimg.cn/hKh2l


前言:這個專欄主要講述動態規劃算法,所以下面題目主要也是這些算法做的 ?

我講述題目會把講解部分分為3個部分:
1、題目解析

2、算法原理思路講解

3、代碼實現


乘積為正數的最長子數組長度

題目鏈接:乘積為正數的最長子數組長度

題目

給你一個整數數組?nums?,請你求出乘積為正數的最長子數組的長度。

一個數組的子數組是由原數組中零個或者更多個連續數字組成的數組。

請你返回乘積為正數的最長子數組長度。

示例? 1:

輸入:nums = [1,-2,-3,4]
輸出:4
解釋:數組本身乘積就是正數,值為 24 。

示例 2:

輸入:nums = [0,1,-2,-3,-4]
輸出:3
解釋:最長乘積為正數的子數組為 [1,-2,-3] ,乘積為 6 。
注意,我們不能把 0 也包括到子數組中,因為這樣乘積為 0 ,不是正數。

示例 3:

輸入:nums = [-1,-2,-3,0,1]
輸出:2
解釋:乘積為正數的最長子數組是 [-1,-2] 或者 [-2,-3] 。

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i]?<= 10^9

解法

算法原理解析

我們這題使用動態規劃,我們做這類題目可以分為以下五個步驟

  1. 狀態顯示
  2. 狀態轉移方程
  3. 初始化(防止填表時不越界)
  4. 填表順序
  5. 返回值
  • 狀態顯示
f[i] 表示 :以 i 結尾的所有子數組中,乘積為「正數」的最長子數組的長度。
g[i] 表示 :以 i 結尾的所有子數組中,乘積為「負數」的最長子數組的長度。
  • 狀態轉移方程
遍歷每?個位置的時候,我們要同步更新兩個 dp 數組的值。
對于 f[i] ,也就是以 i 為結尾的乘積為「正數」的最??數組,根據 nums[i] 的值,可以分為三種情況:
  1. nums[i] = 0 時,所有以 i 為結尾的?數組的乘積都不可能是正數,此時 f[i] = 0 ;
  2. nums[i] > 0 時,那么直接找到 f[i - 1] 的值(這?請再讀?遍 f[i - 1] 代表的意義,并且考慮如果 f[i - 1] 的結值是 0 的話,影不影響結果),然后加?即可,此時 f[i] = f[i - 1] + 1
  3. nums[i] < 0 時,此時我們要看 g[i - 1] 的值(這?請再讀?遍 g[i - 1] 代 表的意義。因為負負得正,如果我們知道以 i - 1 為結尾的乘積為負數的最??數組的?度,加上 1 即可),根據 g[i - 1] 的值,?要分兩種情況:
    1. g[i - 1] = 0 ,說明以 i - 1 為結尾的乘積為負數的最??數組是不存在的,又因為 nums[i] < 0 ,所以以 i 結尾的乘積為正數的最??數組也是不存在的,此f[i] = 0
    2. g[i - 1] != 0 ,說明以 i - 1 為結尾的乘積為負數的最??數組是存在的,又因為 nums[i] < 0 ,所以以 i 結尾的乘積為正數的最??數組就等于 g[i - 1] + 1
綜上所述, nums[i] < 0 時, f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;
同理可得, nums[i] >?0 時,g[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
  • 初始化(防止填表時不越界)
在本題中,最前?加上?個格?,并且讓 f[0] = g[0] = 0 即可。
  • 填表順序
根據「狀態轉移?程」易得,填表順序為「從左往右,兩個表?起填」。
  • 返回值
根據「狀態表示」,我們要返回 f 表中的最?值。
以上本道題目已經講解完畢,大家可以試一試了。

代碼實現

class Solution {
public:int getMaxLen(vector<int>& nums) {int n = nums.size();vector<int> f(n + 1);		// 以i為結尾,乘積為正數的最長子數組vector<int> g(n + 1);		// 以i為結尾,乘積為負數的最長子數組// 初始化f[0] = 0;g[0] = 0;int ans = INT_MIN;for (int i = 1; i <= n; i++){if (nums[i-1] > 0){f[i] = f[i - 1] + 1;g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;}else if (nums[i-1] < 0){f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;g[i] = f[i - 1] + 1;}ans = max(ans, f[i]);}return ans;}
};

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

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

相關文章

ScheduledThreadPoolExecutor學習

簡介 ScheduledThreadPoolExecutor 是 Java 中的一個類&#xff0c;它屬于 java.util.concurrent 包。這個類是一個線程池&#xff0c;用于在給定的延遲后運行命令&#xff0c;或者定期地執行命令。它是 ThreadPoolExecutor 的一個子類&#xff0c;專門用于處理需要定時或周期…

解釋索引是什么以及它們是如何提高查詢性能的

索引在數據庫管理系統中是一個重要的數據結構&#xff0c;用于幫助快速檢索數據庫表中的數據。它可以被看作是一個指向表中數據的指針列表&#xff0c;這些指針按照某種特定的順序&#xff08;如字母順序或數字順序&#xff09;排列。索引的工作原理類似于書籍的目錄&#xff1…

Python爬蟲實戰第二例【二】

零.前言&#xff1a; 本文章借鑒&#xff1a;Python爬蟲實戰&#xff08;五&#xff09;&#xff1a;根據關鍵字爬取某度圖片批量下載到本地&#xff08;附上完整源碼&#xff09;_python爬蟲下載圖片-CSDN博客 大佬的文章里面有API的獲取&#xff0c;在這里我就不贅述了。 一…

kitex 入門和基于grpc的使用

&#x1f4d5;作者簡介&#xff1a; 過去日記&#xff0c;致力于Java、GoLang,Rust等多種編程語言&#xff0c;熱愛技術&#xff0c;喜歡游戲的博主。 &#x1f4d7;本文收錄于kitex系列&#xff0c;大家有興趣的可以看一看 &#x1f4d8;相關專欄Rust初階教程、go語言基礎系…

【Web】青少年CTF擂臺挑戰賽 2024 #Round 1 wp

好家伙&#xff0c;比賽結束了還有一道0解web題是吧( 隨緣寫點wp(簡單過頭&#xff0c;看個樂就好) 目錄 EasyMD5 PHP的后門 PHP的XXE Easy_SQLi 雛形系統 EasyMD5 進來是個文件上傳界面 說是只能上傳pdf&#xff0c;那就改Content-Type為application/pdf&#xff0c;改…

11.盛最多水的容器

題目&#xff1a;給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器可以儲存的最大水量。 解題思路&#xff1a;可以…

判斷閏年(1000-2000)

判斷規則&#xff1a;1.能被4整除&#xff0c;不能被100整除是閏年,2.能被400整除是閏年 #include <stdio.h>int is_leap_year(int n){if((n % 400 0)||((n % 4 0)&&(n % 100 ! 0)))return 1;elsereturn 0; } int main() {int i 0;int count 0;for(i 1000;…

基于PHP的在線英語學習平臺

有需要請加文章底部Q哦 可遠程調試 基于PHP的在線英語學習平臺 一 介紹 此在線英語學習平臺基于原生PHP開發&#xff0c;數據庫mysql。系統角色分為學生&#xff0c;教師和管理員。(附帶參考設計文檔) 技術棧&#xff1a;phpmysqlphpstudyvscode 二 功能 學生 1 注冊/登錄/…

C++/Python簡單練手題

前言 最近需要開始使用python&#xff0c;但是對python了解的并不多&#xff0c;于是先從很早之前剛學C時寫過的一些練手題開始&#xff0c;使用python來實現相同的功能&#xff0c;在溫習python基礎語法的同時&#xff0c;也一起來感受感受python的魅力 99乘法表 c&#xf…

kettle開發-Day43-加密環境下運行作業

前言&#xff1a; 金三銀四&#xff0c;開年第一篇我們來介紹下&#xff0c;怎么在加密情況下運行我們的kettle作業及任務。無疑現在所有企業都認識到加密的重要性&#xff0c;加密后的文件在對外傳輸的時候不能被訪問&#xff0c;訪問時出現一堆亂碼&#xff0c;同時正常的應用…

1分鐘學會Python字符串前后綴與編解碼

1.前綴和后綴 前綴和后綴指的是&#xff1a;字符串是否以指定字符開頭和結尾 2.startswith() 判斷字符串是否以指定字符開頭&#xff0c;若是返回True&#xff0c;若不是返回False str1 "HelloPython"print(str1.startswith("Hello")) # Trueprint…

Navicat Premium 16:打破數據庫界限,實現高效管理mac/win版

Navicat Premium 16是一款功能強大的數據庫管理工具&#xff0c;旨在幫助用戶更輕松地連接、管理和保護各種數據庫。該軟件支持多種數據庫系統&#xff0c;如MySQL、Oracle、SQL Server、PostgreSQL等&#xff0c;并提供了直觀的圖形界面&#xff0c;使用戶能夠輕松地完成各種數…

【力扣白嫖日記】585.2016年的投資

前言 練習sql語句&#xff0c;所有題目來自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免費數據庫練習題。 今日題目&#xff1a; 585.2016年的投資 表&#xff1a;Person 列名類型pidinttiv_2015floattiv_2016floatlatfloatlonfloat pid …

AI也來打摜蛋,難道人工智能也能當領導?

在人工智能&#xff08;AI&#xff09;的研究領域中&#xff0c;游戲被視為現實世界的簡化模型&#xff0c;常常是研究的首選平臺。這些研究主要關注游戲代理的決策過程。例如&#xff0c;中國的傳統卡牌游戲“摜蛋”&#xff08;字面意思是“扔雞蛋”&#xff09;就是一個挑戰…

Unity(第十七部)Unity自帶的角色控制器

組件Character Controller 中文角色控制器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class player : MonoBehaviour {private CharacterController player;void Start(){player GetComponent<CharacterController>();}v…

對于爬蟲的學習

本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求&#xff1a;找出里面所有javaxxString str"Java自從95年問世以來&#xff0c;經歷了…

騰訊日常實習-數據科學-初試涼經

個人背景&#xff1a;雙985 騰訊會議面了一個小時左右&#xff0c;過程如下&#xff1a; 1.面試官首先介紹了一下部門&#xff08;騰訊云&#xff09;的情況和業務方向。 2.讓我介紹一下自己&#xff08;目前情況&#xff0c;科研經歷&#xff0c;項目經歷&#xff09;。 3.就我…

HarmonyOS—編譯構建概述

編譯構建是將應用/服務的源代碼、資源、第三方庫等&#xff0c;通過編譯工具轉換為可直接在硬件設備上運行的二進制機器碼&#xff0c;然后再將二進制機器碼封裝為HAP/APP軟件包&#xff0c;并為HAP/APP包進行簽名的過程。其中&#xff0c;HAP是可以直接運行在模擬器或真機設備…

牛皮癬發作和復發的觸發因素

谷禾健康 銀屑病&#xff0c;又叫牛皮癬&#xff0c;會導致出現皮疹伴發癢的鱗狀斑塊&#xff0c;最常見于膝蓋、肘部、軀干和頭皮。通常呈周期性發展&#xff0c;發作數周或數月&#xff0c;然后消退一段時間&#xff0c;長期的發作和復發會給患者帶來很大的痛苦和困擾&#x…

Qt5.9.9交叉編譯(帶sqlite3、OpenSSL)

1、交叉編譯工具鏈 這里ARM平臺是ARM CortexA9的&#xff0c;一般交叉編譯工具鏈demo板廠商都會提供&#xff0c;若未提供或想更換新版本的交叉編譯工具鏈可參考以下方式獲取。 1.1 下載適用于ARM CortexA9的交叉編譯工具鏈 Linaro Releases下載gcc4的最新版xxxx-i686_arm-li…