【專題刷題】雙指針(一)

📝前言說明:

  • 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:1,本人解法 + 本人屎山代碼;2,優質解法 + 優質代碼;3,精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

視頻

  • 293. 移動零
    • 個人解
    • 優質解
  • 1089. 復寫零
    • 個人解
    • 優質解:

293. 移動零

在這里插入圖片描述


個人解

思路:請添加圖片描述
用時:15:16,(真是沒救了,寫成這樣)
屎山代碼:通過

class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size();int slow = 0;int fast = 1;while(slow < n && fast < n){while(slow < n && nums[slow] != 0){slow++;}while(fast < n && (fast < slow || nums[fast] == 0)){fast++;}if(slow < n && fast < n){swap(nums[slow], nums[fast]);slow++;fast++;}}}
};

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


優質解

思路:整個數組可以劃分成:已排序區[0, slow] + 零區[ slow + 1, fast ) + 待排序區[fast, n-1]
我屎山代碼的問題:我的slowfast是分別移動的,后續還需要自己維護fast > slow
優質解法:

  • slow指針始終指向已排序區的最后一個元素,slow不主動移動,只在交換時移動,這樣就可以始終用來標識已排序區的位置。
  • fast指針遍歷數組,當fast != 0時,和slow + 1位置的0交換。
class Solution {
public:void moveZeroes(vector<int>& nums) {int slow = -1, fast = 0;for(fast = 0; fast < nums.size(); fast++){if(nums[fast]){swap(nums[fast], nums[slow + 1]);slow++;}}}
};

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


1089. 復寫零

在這里插入圖片描述

個人解

思路:一個指針在前,一個指針在后,前指針遇到0要復寫的時候,通過后指針,把復寫位置后的元素都往后移動一位,騰出空間。

用時:17:21
屎山代碼:通過

class Solution {
public:void duplicateZeros(vector<int>& arr) {int n = arr.size();int slow = 0, fast = n - 1;while(slow < n - 1){if(arr[slow]){slow++;}else{slow++;for(fast = n - 1; slow < fast; fast--){arr[fast] = arr[fast - 1];}arr[slow] = 0;slow++;}}}
};

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


優質解:

首先,我們先思考,如果不是就地操作的解法:
創建一個新的數組,然后一個指針cur指向原數組,一個指針dest指向新數組,dest根據cur的值不斷進行復寫操作。

那換成就地操作呢?
如果直接這么操作,那dest復寫兩次的時候就會覆蓋還沒有復寫的值。

那能不能從后往前進行復寫操作?
答案是可以的,問題是要先找到最后一個復寫的數。

最后一個復寫的數由什么決定?
如果我們看題不仔細,不認真思考的話就會簡單認為:0的個數直接決定后面幾個數會被移出數組外,如:若有3個0,那么倒數第4個數就是最后一個復寫的數。(因為后3個數的位置 → 被前面復寫的0個替代了)
但其實不然,因為:0有可能被移動出去

所以,重點又變成了,如何找最后一個要復寫的數的位置。
方法:我們先模擬一遍復寫的過程但是不復寫,就可以讓cur定位到最后一個要復寫的元素,dest指向從后往前復寫的第一個要復寫的開始位置。
步驟:

  1. cur指向當前要復寫的元素,遍歷數組,dest指向已經復寫完的位置(的最后一個)
  2. arr[cur] == 0dest移動兩步,否則為一步
  3. 判斷dest是否到達結束位置,達到了就提前退出循環。
    注意點1:在本次循環中的cur不能移動,因為cur指向的是要復寫的,如果移動了就到了下一個沒有復寫的位置。
    注意點2:會有在數組外復寫的情況:這種情況是在dest == n-1的時候還要復寫兩個0,解決方法:只需要讓arr[n-1] = 0dest -= 2cur -= 1就行,因為這種情況下已確定最后一位寫的是0

文字敘述晦澀難懂,建議畫圖

代碼:

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0, dest = -1, n = arr.size(); // dest指向復寫完的最后一個位置while(cur < n) {if(arr[cur]) dest++; else dest += 2;if(dest >= n-1) break; // dest = n-1 代表已經寫完最后一個位置了cur++; // cur指向的元素代表要復寫的元素}if(dest == n) // 代表在數組外面寫了{arr[n-1] = 0;dest -= 2;cur -= 1;}while(cur >= 0){if(arr[cur]) arr[dest--] = arr[cur--];else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};

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

🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

WebSocket 技術詳解

引言 在現代Web應用中&#xff0c;實時通信已經成為不可或缺的一部分。想象一下聊天應用、在線游戲、股票交易平臺或協作工具&#xff0c;這些應用都需要服務器能夠即時將更新推送給客戶端&#xff0c;而不僅僅是等待客戶端請求。WebSocket技術應運而生&#xff0c;它提供了一…

【redis】初識redis

初識redis Redis 是一種基于鍵值對&#xff08;key-value&#xff09; 的 NoSQL 的數據庫&#xff0c;它與很多鍵值數據庫不同&#xff0c; Redis 中的值可以是 string&#xff08;字符串&#xff09; 、hash&#xff08;哈希&#xff09;、list&#xff08;鏈表&#xff09;、…

UE5 制作方塊邊緣漸變邊框效果

該效果基于之前做的&#xff08;https://blog.csdn.net/grayrail/article/details/144546427&#xff09;進行修改得到&#xff0c;思路也很簡單&#xff1a; 1.打開實時預覽 1.為了制作時每個細節調整方便&#xff0c;勾選Live Update中的三個選項&#xff0c;開啟實時預覽。…

基于springboot的“嗨玩旅游網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于springboot的“嗨玩旅游網站”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統功能結構圖 局部E-R圖 系統首頁界面 系統注冊…

grafana/loki 部署搜集 k8s 集群日志

grafana/loki 和 grafana/loki-stack 的區別 ?Grafana 提供了多個 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相關組件,其中主要包括 grafana/loki 和 grafana/loki-stack。?它們的主要區別如下:? 1.grafana/loki Helm Chart: 專注于 Loki 部署: 該 Chart 專門…

Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置

作者&#xff1a;濯光、翼嚴 Kubernetes 配置管理的局限 目前&#xff0c;在 Kubernetes 集群中&#xff0c;配置管理主要通過 ConfigMap 和 Secret 來實現。這兩種資源允許用戶將配置信息通過環境變量或者文件等方式&#xff0c;注入到 Pod 中。盡管 Kubernetes 提供了這些強…

python自動化瀏覽器標簽頁的切換

#獲取全部標簽頁的句柄返回句柄的列表 handleswebdriver.window_handles#獲取全部標簽頁的句柄返回句柄的列表 print(len(handles)) 切換標簽頁 handleswebdriver.window_handles webdriver.switch_to.window(handles[index])#切換到第幾個標簽頁就寫幾 關閉標簽頁 關閉標…

微信小程序組件傳參

微信小程序組件傳參感覺和vue還是挺像的 父組件向子組件傳參 在小程序中父組件子組件傳參&#xff0c;主要使用properties屬性。演示下&#xff1a; 創建組件文件夾component&#xff0c;創建組件demoComponent&#xff0c;記得創建的時候選擇組件&#xff0c;不是page頁面 …

【嵌入式硬件】LAN9253說明書(中文版)

目錄 1.介紹 1.1總體介紹 1.2模式介紹 1.2.1微控制器模式: 1.2.2 擴展模式 1.2.3 數字IO模式 1.2.4 各模式圖 2.引腳說明 2.1 引腳總覽 2.2 引腳描述 2.2.1 LAN端口A引腳 2.2.2 LAN端口B引腳 2.2.3 LAN端口A和、B電源和公共引腳 2.2.4 SPI/SQI PINS 2.2.5 分布式時…

【C語言基礎】雙指針在qsort函數中的應用

在C語言中使用 qsort 對字符串數組&#xff08;如 char* 數組&#xff09;排序時&#xff0c;必須轉換為雙指針&#xff08;char**&#xff09;&#xff0c;這是由字符串數組的內存結構和 qsort 的工作原理決定的。以下是詳細解釋&#xff1a; 一、底層原理分析 1. 字符串數組…

批處理(Batch Processing)的詳解、流程及框架/工具的詳細對比

以下是批處理&#xff08;Batch Processing&#xff09;的詳解、流程及框架/工具的詳細對比&#xff1a; 一、批處理核心概念 定義&#xff1a; 批處理是離線處理大量數據或任務的自動化流程&#xff0c;特點是無人值守、高吞吐量、資源密集型&#xff0c;常用于數據清洗、報表…

基于FreeRTOS和LVGL的多功能低功耗智能手表(APP篇)

目錄 一、簡介 二、軟件框架 2.1 MDK工程架構 2.2 CubeMX框架 2.3 板載驅動BSP 1、LCD驅動 2、各個I2C傳感器驅動 3、硬件看門狗驅動 4、按鍵驅動 5、KT6328藍牙驅動 2.4 管理函數 2.4.1 StrCalculate.c 計算器管理函數 2.4.2 硬件訪問機制-HWDataAccess 2.4.3 …

【初階數據結構】——算法復雜度

一、前言 1、數據結構是什么&#xff1f; 數據結構(Data Structure)是計算機存儲、組織數據的?式&#xff0c;指相互之間存在?種或多種特定關系的數 據元素的集合。沒有?種單?的數據結構對所有?途都有?&#xff0c;所以我們要學各式各樣的數據結構&#xff0c; 如&…

記錄 | Pycharm中如何調用Anaconda的虛擬環境

目錄 前言一、步驟Step1 查看anaconda 環境名Step2 Python項目編譯器更改 更新時間 前言 參考文章&#xff1a; 參考視頻&#xff1a;如何在pycharm中使用Anaconda創建的python環境 自己的感想 這里使用的Pycharm 2024專業版的。我所使用的Pycharm專業版位置&#xff1a;【僅用…

linux如何用關鍵字搜索日志

在 Linux 系統中搜索日志是日常運維的重要工作&#xff0c;以下是幾種常用的關鍵字搜索日志方法&#xff1a; 1. 基礎 grep 搜索 bash 復制 # 基本搜索&#xff08;區分大小寫&#xff09; grep "keyword" /var/log/syslog# 忽略大小寫搜索 grep -i "error&…

K-均值聚類機器學習算法的優缺點

K-均值聚類是一種常用的無監督學習算法&#xff0c;用于將具有相似特征的數據點聚集到一起。以下是K-均值聚類算法的步驟及其優缺點&#xff1a; K-均值聚類算法步驟&#xff1a; 初始化&#xff1a;隨機選擇K個點作為初始的聚類中心。分配數據點&#xff1a;將每個數據點分配…

AI驅動SEO關鍵詞實戰策略

內容概要 AI驅動的SEO關鍵詞優化體系通過技術融合實現了策略升級。該框架以語義理解模型為基礎&#xff0c;結合實時流量監測與行業數據庫&#xff0c;構建了包含關鍵詞挖掘、競爭評估、內容適配三大核心模塊的閉環系統。通過自然語言處理&#xff08;NLP&#xff09;技術解析…

Golang|在線排查協程泄漏

根據我們的代碼&#xff0c;前5毫秒內&#xff0c;每隔1毫秒就會來一個請求&#xff0c;5毫秒之后由于前面的協程執行完&#xff0c;后面又會來新的協程&#xff0c;所以協程數目會保持穩定但是代碼一運行&#xff0c;協程數量一直增長&#xff0c;發生了協程泄漏 我們可以list…

Java項目之基于ssm的QQ村旅游網站的設計(源碼+文檔)

項目簡介 QQ村旅游網站實現了以下功能&#xff1a; 管理員權限操作的功能包括管理景點路線&#xff0c;板塊信息&#xff0c;留言板信息&#xff0c;旅游景點信息&#xff0c;酒店信息&#xff0c;對景點留言&#xff0c;景點路線留言以及酒店留言信息等進行回復&#xff0c;…

高級語言調用C接口(四)結構體(2)-Python

這個專欄好久沒有更新了&#xff0c;主要是坑開的有點大&#xff0c;也不知道怎么填&#xff0c;涉及到的開發語言比較多&#xff0c;寫起來比較累&#xff0c;需要看的人其實并不多&#xff0c;只能說&#xff0c;慢慢填吧&#xff0c;中間肯定還會插很多別的東西&#xff0c;…