雙指針---《移動零》

目錄

文章前言

題目描述?

算法原理講解

忽略限制條件的解法

原理講解

?思路總結

?代碼展示

雙指針解法

原理講解

思路總結

?代碼展示

大總結


💫只有認知的突破💫才來帶來真正的成長💫編程技術的學習💫沒有捷徑💫一起加油💫

? ? ? ? ? ?🍁感謝各位的觀看🍁歡迎大家留言🍁咱們一起加油🍁努力成為更好的自己🍁

文章前言

為了提高自己的編程技術和能力,本博主開始要更新相關算法題的內容了。我會分類型的進行算法題的講解,由于博主是第一次真正意義上接觸系統的刷題訓練,作為一個小白,有不足或錯誤的地方,很愿意聽取在座各位大佬的批評和指教。廢話不多說,讓我們開啟刷算法題的旅行吧!

題目描述?

題目鏈接:移動零

如圖所示的要求:

給你一個數組,要求把這個數組的0元素,全部移動到數組的后面,非0元素全部移動到數組的前面,而且這些非0元素的相對順序保持不變注意:不能新開辟一個數組,然后再把這新數組里面的元素拷貝到以前的數組中,這是不允許的,只能在原數組上進行操作。

算法原理講解

忽略限制條件的解法

本博主在一開始寫這個題目的時候,就沒有注意到限制條件——不允許開辟數組。雖然,這個解法能在Leetcode上能通過,但是不符合題目要求。我想把這個寫法也保留下來,它也算是一種思想,萬一在別的題目就合適呢!

原理講解

創建一個和原數組空間大小一樣的新數組,在這個新數組上,創建兩個“指針”這里的指針不是真正的指針,就是通過下標訪問的變量。第一個指針begin_num指向數組的首元素第二個指針end_num指向數組的最后一個元素,如圖所示(以示例1為例):

然后再去遍歷原數組,遇到0元素,就存放在end_num,然后end_num再向前 -? - ,為存儲下一個0元素做準備,當遇到非0元素時,就存放在begin_num,然后begin_num向后走 + +,為下一個非0元素做準備,直到原數組遍歷完畢。如圖所示:

?思路總結

1.新建立和原數組一樣大的數組

2.創建兩個“指針”,分別指向新數組的頭和尾處的空間

3.依次遍歷原數組

? ? ? ? ? ? ? ? 3.1:遇到0元素,就插入end_num,然后end_num- -

? ? ? ? ? ? ? ? 3.2:遇到非0元素,就插入begin_num,然后begin_num++

4.原數組訪問完畢就結束

5.在把新數組排好序的元素賦值拷貝給原數組

?代碼展示

class Solution {
public:void moveZeroes(vector<int>& nums) {vector<int>num(nums.size(),1);  //開辟一樣大小的新數組//創建兩個指針auto end_num=num.end()-1;    //指向新數組的首元素auto begin_num=num.begin();    //指向新數組的尾元素for(auto&e:nums){if(e==0)        //0元素插入end_num{*end_num=e;end_num--;}else            //非0元素插入begin_num{*begin_num=e;begin_num++;}}nums=num;        //把排好序的新數組賦值拷貝給原數組}
};

雙指針解法

原理講解

我們解題時,所謂的雙指針并不是真正的指針不是int*,char*……而是指向數組的下標變量,比如,0,1,2……。所以大家不要感到害怕。

因為題目要求只能在原數組進行操作,所以我們就要摒棄開辟新數組的思想了。根據題目要求:非0元素全部在數組的左邊,0元素全部在數組的右邊。使用新的思想:數組劃分(數組分塊)的思想,這個數組被劃分為兩個區域,一塊是非0區域,另一塊是0區域,如圖所示:

這個時候,創建兩個指針,一個是cur,另一個是dst。cur指針的作用:它把數組分為已處理和待處理的兩個部分dst指針的作用:它把已處理過的數組分為,左邊全是非0元素(保持相對順序)和右邊全是0元素的兩個部分。所以,這倆指針把數組分為3個部分。如圖所示:

所以數組被分為三個區間:[0,dst] , [dst+1,cur-1] , [cur,n-1][0,dst]全是非0元素[dst+1,cur-1]全是0元素[cur,n-1]待處理。其中,dst指向非0元素區間的最后一個非0元素。在遍歷數組的過程中,始終保持這三個區間的性質不變,就會達到題目要求。讓cur=0指向首元素位置,因為要起始遍歷數組。對于dst,要使它指向首元素的前一個位置,dst=-1。因為dst指向的是非0元素,在起始位置,是無法確定起始元素是否為非0元素,所以就把dst放在前面。如圖所示:

當cur指向的元素是0時,dst不動。當cur指向的元素非0時,dst++,然后cur和dst指向的元素進行交換,然后cur繼續往后走,直到遍歷完數組結束。

思路總結

1.cur=0指向首元素,dst=-1指向數組前面

2.cur指向的元素為0 , dst不動

3.cur指向的元素非0,dst++

? ? ? ? ? ? ? ? ?3.1:然后swap(dst元素,cur元素)

? ? ? ? ? ? ? ? ?3.2:cur++往后走

4.cur遍歷完數組結束

?代碼展示

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dst=-1,cur=0;cur<nums.size();cur++)if(nums[cur])swap(nums[++dst],nums[cur]);}
};

大總結

根據本題目的敘述和要求,具有很明顯的數組劃分的特點我們要進行合理的區間劃分,在遍歷數組的過程中,要保持各個區間的性質不變,才會有對的結局這里要注意dst的起始位置。

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

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

相關文章

jangow-01-1.0.1靶機攻略

1.進行配置&#xff0c;按住shift&#xff0c;在圖一界面按e進去得到圖二 .ro 替換為 rw signie init/bin/bash ctrlx&#xff0c;ip a查看網卡信息&#xff0c;修改配置文件網卡信息 修改為如圖所示內容后按shift?然后輸入wq點擊回車退出&#xff0c;然后重啟靶機 2.在kali中…

安全上網沙箱:多方面解決政企私的上網問題

在數字化的浪潮中&#xff0c;網絡已成為我們工作與生活不可或缺的一部分。然而&#xff0c;網絡的便捷也伴隨著諸多安全隱患&#xff0c;尤其是對于企業、個人以及政企機構而言&#xff0c;安全上外網成為了至關重要的課題。 隔離保護&#xff1a;構建安全堡壘 沙箱技術在內網…

C++ string的模擬實現

Hello!!大家早上中午晚上好&#xff0c;昨天復習了string的使用&#xff0c;今天來模擬實現一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我們需要一個string的頭文件用來做變量、函數、類等聲明&#xff1b;再需要一個test文件來做測試,還需…

Java 中裝飾者模式與策略模式在埋點系統中的應用

前言 在軟件開發中&#xff0c;裝飾者模式和策略模式是兩種常用的設計模式&#xff0c;它們在特定的業務場景下能夠發揮巨大的作用。本文將通過一個實際的埋點系統案例&#xff0c;探討如何在 Java 中運用裝飾者模式和策略模式&#xff0c;以及如何結合工廠方法模式來優化代碼…

【3-22 list 詳解STL C++ 】

先看代碼&#xff0c;常用的就是代碼中有的那些 #include <bits/stdc.h> using namespace std; int main() {list<int> mylist;for(int i0;i<5;i){mylist.push_back(i);//TODO}for(const auto&i:mylist)cout<<i<<\n;//fanzhuanreverse(mylist.…

田間機器人幼苗視覺檢測與護苗施肥裝置研究(大綱)

田間機器人幼苗視覺檢測與護苗施肥裝置研究 基于多光譜視覺與精準施肥的農業機器人系統設計 第一章 緒論 1.1 研究背景與意義 農業智能化需求&#xff1a; 傳統幼苗檢測依賴人工&#xff0c;效率低且易遺漏弱苗/病苗施肥不精準導致資源浪費和環境污染 技術挑戰&#xff1a;…

如何在Linux CentOS上安裝和配置Redis

如何在Linux CentOS上安裝和配置Redis 大家好&#xff0c;我是曾續緣。歡迎來到本教程&#xff01;今天我將向您介紹在Linux CentOS上安裝和配置Redis的詳細步驟。Redis是一個高性能的鍵值存儲系統&#xff0c;常用于緩存、消息隊列和數據持久化等應用場景。讓我們一起開始吧&…

requests庫post方法怎么傳params類型的參數

在使用 requests 庫的 post 方法時&#xff0c;params 類型的參數通常用于在 URL 中作為查詢字符串傳遞。這與 data 或 json 參數不同&#xff0c;后者是放在請求體中的。下面詳細介紹如何在使用 post 方法時傳遞 params 參數。 使用 params 參數 params 參數接受一個字典或包…

C++常見問題與思考

TLS&#xff08;線程本地存儲&#xff09;原理 線程本地存儲&#xff08;Thread Local Storage&#xff0c;TLS&#xff09;是一種機制&#xff0c;它允許每個線程擁有自己獨立的變量實例&#xff0c;這些變量的生命周期與線程相同。也就是說&#xff0c;不同線程對同一個 TLS…

如何快速下載并安裝 Postman?

從下載、安裝、啟動 Postman 這三個方面為大家詳細講解下載安裝 Postman 每一步操作&#xff0c;幫助初學者快速上手。 Postman 下載及安裝教程(2025最新)

使用Gitee Go流水線部署個人項目到服務器指南

使用Gitee Go流水線部署個人項目到服務器指南 前言&#xff01;&#xff01;&#xff01; 本文解決的問題&#xff1a; 你有一臺ECS服務器&#xff0c;你在上面部署了一個Java服務也就是一個jar&#xff0c;你覺著你每次手動本地打包&#xff0c;上傳&#xff0c;在通過命令去…

Linux第一節:Linux系統編程入門指南

摘要 本文面向Linux初學者&#xff0c;系統講解操作系統核心概念、Shell命令實戰、權限管理精髓及目錄結構解析。通過思維導圖命令示例原理解析的方法&#xff0c;幫助開發者快速構建Linux知識體系&#xff0c;掌握生產環境必備技能。 一、Linux的前世今生&#xff1a;從實驗室…

【Linux 維測專欄 5 -- linux pstore 使用介紹】

文章目錄 Linux pstore 功能簡介1. pstore 概述2. pstore 的核心功能3. pstore 的工作原理4. pstore 的使用示例5. pstore 的優勢6. 典型應用場景配置示例1)DTS配置2)config配置運行測試及log問題小結Linux pstore 功能簡介 1. pstore 概述 pstore(Persistent Storage)是…

在 ASP .NET Core 9.0 中使用 Scalar 創建漂亮的 API 文檔

示例代碼&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90407900 Scalar 是一款可幫助我們為 API 創建精美文檔的工具。與感覺有些過時的默認 Swagger 文檔不同&#xff0c;Scalar 為 API 文檔提供了全新而現代的 UI。其簡潔的設計讓開發人員可以輕松找到測試…

Rabbitmq消息被消費時拋異常,進入Unacked 狀態,進而導致消費者不斷嘗試消費(下)

一、消費流程圖 消息在消費出現異常的時候&#xff0c;將一直保留在消息隊列&#xff0c;所以你會看到以下奇怪的現象&#xff1a; 消息隊列僅有5個消息&#xff0c; 投遞速度也非常快&#xff0c;結果卻一直無法消費掉。 二、重試策略 重試機制的使用場景&#xff1a;重試機制…

【STM32】知識點介紹二:GPIO引腳介紹

文章目錄 一、概述二、GPIO的工作模式三、寄存器編程 一、概述 GPIO&#xff08;英語&#xff1a;General-purpose input/output&#xff09;,即通用I/O(輸入/輸出)端口&#xff0c;是STM32可控制的引腳。STM32芯片的GPIO引腳與外部設備連接起來&#xff0c;可實現與外部通訊、…

JavaScript流程控制精講(二)運算符與循環實戰

JavaScript流程控制精講&#xff08;二&#xff09;運算符與循環實戰 學習目標&#xff1a;掌握條件判斷與循環控制&#xff0c;實現基礎業務邏輯 核心要點&#xff1a;運算符優先級 | 短路運算 | 循環優化 | 項目實戰 一、運算符進階技巧 1.1 算術運算符 console.log(5 % 3)…

如何在IPhone 16Pro上運行python文件?

在 iPhone 16 Pro 上運行 Python 文件需要借助第三方工具或遠程服務&#xff0c;以下是具體實現方法和步驟&#xff1a; 一、本地運行方案&#xff08;無需越獄&#xff09; 使用 Python 編程類 App 以下應用可在 App Store 下載&#xff0c;支持直接在 iPhone 上編寫并運行 …

【趙渝強老師】達夢數據庫的數據庫對象

達夢數據庫中包含各種數據庫對象&#xff0c;主要分為兩大類型&#xff1a;基本數據庫對象和復雜數據庫對象。下面分別進行介紹。 視頻講解如下 【趙渝強老師】達夢數據庫的數據庫對象 一、 基本數據庫對象 常見的基本數據庫對象有&#xff1a;表、索引、視圖、序列、同義詞等…

【每日算法】Day 6-1:哈希表從入門到實戰——高頻算法題(C++實現)

摘要 &#xff1a;掌握高頻數據結構&#xff01;今日深入解析哈希表的核心原理與設計實現&#xff0c;結合沖突解決策略與大廠高頻真題&#xff0c;徹底掌握O(1)時間復雜度的數據訪問技術。 一、哈希表核心思想 哈希表&#xff08;Hash Table&#xff09; 是一種基于鍵值對的…