Leetcode 刷題記錄 05 —— 普通數組

本系列為筆者的?Leetcode 刷題記錄,順序為 Hot 100 題官方順序,根據標簽命名,記錄筆者總結的做題思路,附部分代碼解釋和疑問解答。

目錄

01 最大子數組和

方法一:動態規劃(卡達尼算法)

方法二:二分 + 遞推

02 合并區間

方法:排序

03 輪轉數組

方法:新建數組

04 除自身以外數組的乘積

方法一:左右乘積列表

方法二:左右乘積列表Plus

05 缺失的第一個正數

方法一:哈希映射

方法二:枚舉

方法三:數組改造哈希表

方法四:置換


01 最大子數組和

class Solution {
public:int maxSubArray(vector<int>& nums) {}
};
方法一:動態規劃(卡達尼算法)
  • 聲明 pre,存儲 x之前的最大子數組和,pre = max(pre+x, x)

class Solution {
public:int maxSubArray(vector<int>& nums) {int pre = 0, ans = nums[0];for(const auto& x: nums){pre = max(pre+x, x);ans = max(ans, pre);}return ans;}
};
方法二:二分 + 遞推
  • 建立結構體 Status,包含 iSum, lSum, rSum, mSum

  • 采用二分,不斷切割區間 [l, r],進行遞歸,快速下降后緩慢回升

  • 注:if(l == r) return (Status) {a[l], a[l], a[l], a[l]};

class Solution {
public:struct Status{int iSum, lSum, rSum, mSum;};//緩慢回升:遞推Status pushUp(Status l, Status r){int iSum = l.iSum + r.iSum;int lSum = max(l.lSum, l.iSum + r.lSum);int rSum = max(r.rSum, r.iSum + l.rSum);int mSum = max(max(l.mSum, r.mSum), l.rSum + r.lSum);return (Status) {iSum, lSum, rSum, mSum};}//快速下降:二分Status get(vector<int>& a, int l, int r){if(l == r) return (Status) {a[l], a[l], a[l], a[l]};int m = (l + r) >> 1;Status lSub = get(a, l, m);Status rSub = get(a, m + 1, r);return pushUp(lSub, rSub);}int maxSubArray(vector<int>& nums) {return get(nums, 0, nums.size() - 1).mSum;}
};

02 合并區間

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {}
};
方法:排序
  • sort 原數組

  • 判斷 merged.back()[1] < L,若成立,則添加區間,若不成立,則更新原區間右端點

  • 注:if(intervals.size() == 0) return {};?

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size() == 0) return {};sort(intervals.begin(), intervals.end());vector<vector<int>> merged;for(int i=0; i<intervals.size(); ++i){int L = intervals[i][0];int R = intervals[i][1];if(!merged.size() || merged.back()[1] < L) merged.push_back({L, R});else merged.back()[1] = max(merged.back()[1], R);}return merged;}
};

03 輪轉數組

class Solution {
public:void rotate(vector<int>& nums, int k) {}
};
方法:新建數組
  • 建立新數組 newArr(n),存儲輪轉結果 newArr[(i+k)%n] = nums[i];

class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();vector<int> newArr(n);for(int i=0; i<n; ++i){newArr[(i+k)%n] = nums[i];}nums.assign(newArr.begin(), newArr.end());}
};

nums.assign(newArr.begin(), newArr.end())?意味著用 newArr 中由 begin()end() 界定的元素范圍替換 nums 中原有的元素。

04 除自身以外數組的乘積

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {}
};
方法一:左右乘積列表
  • 建立兩個數組 leftSup(n)rightSup(n),存儲 i 左側和右側元素乘積

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> leftSup(n);leftSup[0] = 1;for(int i=1; i<n; ++i){leftSup[i] = leftSup[i-1] * nums[i-1];}vector<int> rightSup(n);rightSup[n-1] = 1;for(int i=n-2; i>=0; --i){rightSup[i] = rightSup[i+1] * nums[i+1];}vector<int> ans(n);for(int i=0; i<n; ++i){ans[i] = leftSup[i] * rightSup[i];}return ans;}
};
方法二:左右乘積列表Plus
  • 建立一個數組 ans(n),初始存儲 i 左側元素乘積

  • 從右至左,計算 ans(n) 最終值

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> ans(n);ans[0] = 1;for(int i=1; i<n; ++i){ans[i] = ans[i-1] * nums[i-1];}int R = 1;for(int i=n-1; i>=0; --i){ans[i] = ans[i] * R;R *= nums[i];}return ans;}
};

05 缺失的第一個正數

class Solution {
public:int firstMissingPositive(vector<int>& nums) {}
};
方法一:哈希映射

時間復雜度 O(n)、空間復雜度 O(n)

方法二:枚舉

時間復雜度 O(n^2)、空間復雜度 O(1)

方法三:數組改造哈希表

時間復雜度 O(n)、空間復雜度 O(1)

  • 遍歷數組,所有復數改為 n + 1

  • 遍歷數組,判斷 abs(nums[i]) <= n,執行 nums[flag - 1] = -abs(nums[flag - 1]);

  • 遍歷數組,若每個數都是負數,則答案為 n + 1,否則為第一個整數位置加一

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();//改負數for(int i=0; i<n; ++i){if(nums[i] <= 0) nums[i] = n + 1;}//添負號for(int i=0; i<n; ++i){int flag = abs(nums[i]);if(flag <= n) nums[flag - 1] = -abs(nums[flag - 1]);}for(int i=0; i<n; ++i){if(nums[i] > 0) return i + 1; //精髓在負號}return n + 1;}
};
方法四:置換
  • 遍歷數組,判斷 nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i],交換兩數,執行 swap(nums[nums[i] - 1], nums[i])

  • 遍歷數組,若 nums[i] != i + 1,則答案為 i + 1, 否則為 n + 1

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();for(int i=0; i<n; ++i){while(nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){swap(nums[nums[i] - 1], nums[i]);}}for(int i=0; i<n; ++i){if(nums[i] != i + 1){return i + 1;}}return n + 1;}
};

① 為什么 nums[nums[i] - 1] != nums[i] 改成 nums[i] - 1 != i會導致執行超過時間限制?

nums[nums[i] - 1] != nums[i] 可能是位置不同但數值相同,導致無限循環交換。

② 為什么 nums[i] != i + 1 改成 nums[i] - 1 != i會導致執行錯誤?

nums[i] - 1 作為索引進行比較時,可能會涉及到為負數或超出范圍的索引,若 nums[i] 是負數或 0nums[i] - 1 是非法索引,可能導致未定義行為。

文章部分代碼來源于力扣(LeetCode)

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

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

相關文章

《DataWorks 深度洞察:量子機器學習重塑深度學習架構,決勝復雜數據戰場》

在數字化浪潮洶涌澎湃的當下&#xff0c;大數據已然成為推動各行業發展的核心動力。身處這一時代洪流&#xff0c;企業對數據的處理與分析能力&#xff0c;直接關乎其競爭力的高低。阿里巴巴的DataWorks作為大數據領域的扛鼎之作&#xff0c;憑借強大的數據處理與分析能力&…

wordpress自定the_category的輸出結構

通過WordPress的過濾器the_category來自定義輸出內容。方法很簡單&#xff0c;但是很實用。以下是一個示例代碼&#xff1a; function custom_the_category($thelist, $separator , $parents ) {// 獲取當前文章的所有分類$categories get_the_category();if (empty($categ…

2025牛客寒假算法基礎集訓營6

A.復制雞 思路&#xff1a;比較簡單&#xff0c;略。 void solve() {int n, m, k;cin >> n;int last -1, ans 0;for (int i 0; i<n; i){int x;cin >> x;if (x ! last){ans;}last x;}cout << ans << endl; } B.好伙計猜拳 思路&#xff1a;這…

【C#】詳解C#中的內存管理機制

文章目錄 前言一、C#內存管理的基本機制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;棧內存 二、 開發者需要主動管理的場景&#xff08;1&am…

ROS云課基礎題庫-01C++案例-甜甜圈

效率是核心&#xff0c;但效率高的教程會忽略掉非常多的細節。 解決問題的思路和細節對于一個問題的有效求解至關重要。 資料 云課五分鐘-02第一個代碼復現-終端甜甜圈C-CSDN博客 從云課五分鐘到五秒鐘焦慮的甜甜圈向前沖-CSDN博客 說明 復現重要性沒有那么大&#xff0c;…

C/S架構與B/S架構

一、定義與核心區別 C/S架構&#xff08;Client/Server&#xff0c;客戶端/服務器&#xff09; 客戶端需安裝專用軟件&#xff08;如QQ、企業ERP系統&#xff09;&#xff0c;直接與服務器通信。服務器端通常包括數據庫和業務邏輯處理1。特點&#xff1a;客戶端承擔部分計算任務…

【匯編語言】單片機程序執行過程

一、任務需求 指示燈LED4閃爍&#xff0c;亮0.5秒&#xff0c;滅0.5秒&#xff0c;無限循環 二、針對硬件的編程 1、確定原理圖2、確定硬件的物理關系 三、設計步驟 1.用自己的語言描述工作流程 1.1指示燈LED4亮1.2延時0.5秒1.3指示燈LED4滅1.4延時0.5秒1.5跳轉到1.1步 …

openharmony 富對富 WiFi投屏設計

castengine_wifi_display部件別名Sharing&#xff0c;媒體分享之意。擁有流媒體協議接入、媒體預覽、媒體轉分發能力&#xff0c;受投播管理服務管理和調用&#xff0c;是音視頻投播子系統重要的流媒體能力部件。提供一套簡單的Native C的接口&#xff0c;主要業務是Miracast投…

Android項目優化同步速度

最近項目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg庫&#xff0c;發現原來通過google官方的代碼倉&#xff0c;下載太慢了&#xff0c;每秒KB級別的速度。&#xff08;之前下gradle/gradle plugin都不至于這么慢&#xff09;&#xff0c;于是想到配置國內鏡像源來提…

Git 如何配置多個遠程倉庫和免密登錄?

自我簡介&#xff1a;4年導游&#xff0c;10年程序員&#xff0c;最近6年一直深耕低代碼領域&#xff0c;分享低代碼和AI領域見解。 通用后臺管理系統 代號&#xff1a;虎鯨 緣由 每次開發后臺界面都會有很多相同模塊&#xff0c;嘗試抽離出公共模塊作為快速開發的基座。 目標…

JVM組成面試題及原理

Java Virtual Machine&#xff08;JVM&#xff09;是Java程序的運行環境&#xff08;java二進制字節碼的運行環境&#xff09; 好處&#xff1a; 一次編寫&#xff0c;到處運行自動內存管理&#xff0c;垃圾回收機制 JVM由哪些部分組成&#xff0c;運行流程是什么&#xff1f;…

江科大51單片機筆記【11】AT24C02數據存儲秒表

一、數據存儲 先把需要的模塊導入做個測試 //main.c#include <REGX52.H> #include " LCD1602.h" #include " Key.h"void main() {LCD_Init();LCD_ShowString(1,1,"Hello");while(1){}} 代碼思路 分成兩塊寫&#xff0c;一塊寫I2C.c&am…

Hadoop的運行模式

Hadoop的運行模式 1、本地運行模式2、偽分布式運行模式3、完全分布式運行模式4、區別與總結 Hadoop有三種可以運行的模式&#xff1a;本地運行模式、偽分布式運行模式和完全分布式運行模式 1、本地運行模式 本地運行模式無需任何守護進程&#xff0c;單機運行&#xff0c;所有…

2.裝飾器模式

概述 裝飾器模式&#xff1a;在原有結構&#xff0c;動態地為對象添加職責&#xff0c;它是一種靈活的擴展功能方式。 業務場景&#xff1a;創建訂單 假設你正在開發一個電商系統&#xff0c;用戶在創建訂單時可以選擇不同的服務&#xff08;如折扣、配送、禮品包裝等&#…

C++11新特性 10.初始化列表、initializer_list

目錄 一.初始化列表 使用示例 二.initializer_list 1.基本概念 2.使用示例 一.初始化列表 C11提供的統一初始化方式&#xff0c;實現直接對數據初始化 使用示例 /* 初始化列表 */ #include <iostream> using namespace std; class Person { public:Person(string…

Vue 的 render 函數如何與 JSX 結合使用

在 Vue.js 中&#xff0c;render 函數提供了一種更底層的方式來創建虛擬 DOM 節點&#xff0c;而 JSX 則是一種 JavaScript 的語法擴展&#xff0c;允許開發者在 JavaScript 代碼中直接編寫類似 HTML 的結構。結合使用 render 函數和 JSX 可以帶來更高的靈活性和編程能力&#…

基于DeepSeek的智慧醫藥系統(源碼+部署教程)

運行環境 智慧醫藥系統運行環境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技術棧&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧醫藥系統主要分為兩個角色。 游客 尚未進行注冊和登錄。具備登錄注冊、…

南開提出1Prompt1Story,無需訓練,可通過單個連接提示實現一致的文本到圖像生成。

&#xff08;1Prompt1Story&#xff09;是一種無訓練的文本到圖像生成方法&#xff0c;通過整合多個提示為一個長句子&#xff0c;并結合奇異值重加權&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技術&#xff0c;解決了生成圖像中身份不一致…

BLUEM2引擎源碼2025最新版

BLUE 引擎解析&#xff1a;傳奇私服圈中的熱門引擎 一、BLUE 引擎簡介 BLUE 引擎是傳奇私服圈子中較為知名的一款游戲引擎&#xff0c;它在傳統的傳奇引擎基礎上進行了優化和擴展&#xff0c;使得私服開發者可以更加方便地搭建和管理服務器。相比于早期的 GEE、LEG、Hero 等引…

第53天:Web攻防-SQL注入數據庫類型用戶權限架構分層符號干擾利用過程發現思路

#知識點&#xff1a;(本節課了解即可&#xff09; 1、Web攻防-SQL注入-產生原理&應用因素 2、Web攻防-SQL注入-各類數據庫類型利用 一、數據庫知識&#xff1a; 1、數據庫名&#xff0c;表名&#xff0c;列名&#xff0c;數據 2、自帶數據庫&#xff0c;數據庫用戶及權限 3…