每日算法題推送-->今日專題——雙指針法

題目1:https://leetcode.cn/problems/move-zeroes

小編剛看到這道題的時候,想到的第一個方法就是建立一個與原數組等大的新的數組,然后遍歷原數組,如果遇到元素值不為0的元素,就將這個元素放到新數組中,直到遍歷完整個數組,那么當遍歷完整個數組以后,新數組的剩余位置就應該都存放0,直接通過循環存放0即可,最后將新數組中的元素依次賦值給原數組即可。

但是,題目要求,必須在不復制數組的情況下對數組進行原地操作。

這要咋辦?

還是請出我們的老朋友——雙指針法,看利用它是否能解決這道問題。

我們可以這么想,這道題的本質無非就是實現數組的分塊,以某一個位置為界限,這個位置左邊的元素都是不為0的,右邊的元素都等于0.

那我們就可以這樣操作:設定一個界限dest,然后通過算法使得dest左邊的元素都是不為0的。

現在我們來考慮實現這個算法:定義一個整形指針pcur來遍歷數組,初始pcur指向0;而剛開始的時候dest所包含的區域中肯定是一個元素都沒有的,所以我們可以將它初始化為-1。

進行一下操作:如果pcur指向的元素不等于0,那就讓dest先往前走一步,然后再讓dest位置的元素賦值為pcur所指向的元素,如果pcur指向的元素等于0,那直接讓pcur往前走一步即可。

這樣一來,pcur越界以后,dest之前的元素都是不為0的元素,我們只需要再將dest之后的元素通過循環都變成0即可。

void moveZeroes(int* nums, int numsSize)
{//雙指針,定義prev和pcur指針//pcur指向的元素如果不等于0,就讓prev指向的位置的值等于pcur指向位置的值,prev往前走,pcur也往前走,反之,prev不動,pcur往前走int pcur = 0, prev = -1;while (pcur < numsSize){if (nums[pcur] != 0){nums[++prev] = nums[pcur];pcur++;}else {pcur++;}}for (int i = prev+1; i < numsSize; i++){nums[i] = 0;}}

我們來畫圖演示一下這個過程:

上面的思路中我們分別用了兩次循環才實現代碼,有沒有更簡潔的方法呢?能不能一次就搞定啊?

包有的,現在我們就來看一下:

我們還是讓dest初始指向-1,pcur初始指向0,如果pcur指向的元素不為0,那就先讓dest往前走一步,然后交換dest和pcur所指向的元素,反之,直接讓pcur往前走一步,到了最后pcur越界,此時就已經將數組變成預期的效果了

void moveZeroes(int* nums, int numsSize)
{int pcur=0,dest=-1;while(pcur<numsSize){if(nums[pcur]){dest++;int tmp=nums[dest];nums[dest]=nums[pcur];nums[pcur]=tmp;}pcur++;}
}

題目2:https://leetcode.cn/problems/duplicate-zeros

這道題就有點意思了,雖然這道題的難度設置是簡單,但他的整體思路還是比較難想的。

如果我們異地修改整個數組,即創建一個新的數組來完成任務,那這道題就非常簡單,但是這道題要求不能使用這個方法。

小編就不賣關子了,直接給出這道題的整體思路。

以上面的實例1為例,我們呢來講解一下這道題的整體思路。

我們可以根據輸出結果看到數組中要保留的最后一個元素是4,我們可以定義一個整形指針pcur指向要保留的最后一個數據,再定義一個整形指針dest指向數組中的最后一個位置,執行以下操作"

1.根據pcur指向的元素的值判斷dest應該向前走多少步:

  • 如果pcur指向的值是0,那么就進行兩次這個操作:讓dest指向的位置的值賦值為0,同時讓dest往前走一步;之后還要再讓pcur往前走一步
  • 如果pcur指向非0值x,那么就進行以下操作:讓dest指向的位置的值賦值為x,同時讓dest和pcur往前走一步

如以下示意圖:

可以看到,這種算法確實可以幫我們完成任務,但是現在的問題就轉換為我們如何寫一個算法能夠得到最后一個要保留的元素的值。

這個方法比較難想到,我們直接給出算法:

定義兩個指針pcur和dest,pcur初始指向0,dest指向-1,執行以下操作:

1.如果pcur指向的值為非0值,就讓dest往前走一步;判斷dest是否越界(dest>=numssize-1),如果dest越界,那么就直接結束遍歷,如果沒有越界,就讓pcur往前走一步

2.如果pcur指向的值等于0,就讓dest往前走兩步,判斷dest是否越界(dest>=numssize-1),如果dest越界,那么就直接結束遍歷,如果沒有越界,就讓pcur往前走一步

當dest越界的時候,pcur指向的位置就是我們要找的位置。

我們可以畫圖來驗證一下:

可以看到,通過以上算法步驟,pcur最終指向的位置確實就是我們要保留的最后一個數據。

但是,還有一個需要考慮的特殊情況,如以下案例:

我們可以發現,在上面的例子中,dest超過了數組可以表示的范圍,其實原因就是最后一個要保留的數據是0,所以dest要走兩步發生越界,這種情況下,我們需要進行特殊處理:

直接讓數組下標為n-1的位置的值等于0,然后讓pcur往前走一步,dest往前走兩步即可:

我們結合上面的思路來寫一下代碼:

void duplicateZeros(int* arr, int arrSize) 
{int n=arrSize;//先找到數組中最后一個要保留的數據的位置int pcur=0,dest=-1;while(pcur<n){if(arr[pcur])dest++;elsedest+=2;if(dest>=n-1)break;pcur++;} //進行特殊處理if(dest>n-1){arr[n-1]=0;dest-=2;pcur--;}  //進行元素的復寫while(pcur>=0){if(arr[pcur]){arr[dest--]=arr[pcur--];}else{arr[dest--]=0;arr[dest--]=0;pcur--;}}
}

小結:這一小節我們主要通過兩個算法題對應用雙指針的解題思路進行了講解,小編認為第二道題還是比較有難度的。小伙伴們一定要自己在草稿紙或者電腦上多畫一下圖,理解算法的思想。

歡迎小伙伴們在評論區提出問題和討論!!!

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

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

相關文章

告別單次對話:上下文工程如何重塑AI應用架構

1. 前言人工智能應用開發領域正在經歷一場靜悄悄的變革。去年此時&#xff0c;提示工程&#xff08;Prompt Engineering&#xff09;還是各大技術論壇的熱門話題&#xff0c;開發者們熱衷于分享各種精心設計的提示詞模板&#xff0c;試圖通過單次交互獲得理想的大模型輸出。然而…

PM2 管理后端(設置項目自啟動)

查看pm2管理pm2 list ┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──…

CCN中商再獲三項知識產權,為數字化服務添動能

上海中商網絡股份有限公司&#xff08;CCN中商&#xff09;依托持續的研發投入與深厚的技術積淀&#xff0c;在知識產權領域再獲重要突破——成功收獲三項知識產權&#xff0c;囊括實用新型專利《一種3D霓彩智感雙條光柱印刷用全自動生產線》、發明專利《一種一物一碼關聯系統及…

使用LTspice仿真一個異步BUCK電路

確定異步BUCK的規格 輸入電壓&#xff08;Vin&#xff09;&#xff1a;12V 輸出電壓&#xff08;Vout&#xff09;&#xff1a;6V 最大輸出電流&#xff08;Iout&#xff09;&#xff1a;3A 開關頻率&#xff08;fsw&#xff09;&#xff1a;400kHz 輸出電壓紋波&#xff08;Δ…

R語言對excel中多個sheet子表批量進行地理探測器計算

## 基本設置 ## 1) 設定你的工作目錄&#xff08;保持你的原路徑不變&#xff09; setwd("D:/*****/*****/******")## 2) 文件名&#xff08;與xlsx實際名字保持一致&#xff09; xlsx_file <- "驅動因素&#xff08;中低收入&#xff09;.xlsx"## 依…

C++ JSON 數據庫:jsoncpp

jsoncpp1. JSON數據1.1 JSON 的基本語法規則1. 基礎語法要求兩種核心數據結構JSON 與其他數據格式的對比1.2 JSON 的典型應用場景1.3 JSON 解析與生成工具2. 編程語言庫&#xff08;解析/生成&#xff09;1.4 常見錯誤與注意事項2. jsoncpp2.1 基本用法1. 安裝與集成2. 核心類與…

《蒼穹外賣》項目日記_Day9

前言&#xff1a; 上午就把今天任務完成了&#xff0c;就繼續往后學了一些知識&#xff0c;晚上寫下筆記總結一下。 今日完成任務&#xff1a; 調用百度地圖開放平臺&#xff0c;優化用戶下單業務學習SpringTask&#xff0c;定時處理超時、派送中訂單學習WebSocket&#xff0c;…

人工智能學習:Transformer結構中的編碼器層(Encoder Layer)

Transformer結構中的編碼器層(Encoder Layer) 一、編碼器層介紹 概念 編碼器層(Encoder Layer)是Transformer編碼器的基本構建單元,它重復堆疊形成整個編碼器,負責逐步提取輸入序列的特征。每個編碼器層由兩個核心子層組成: 多頭自注意力機制(Multi-Head Self-Attentio…

2018年下半年 系統架構設計師 綜合知識

1.在磁盤調度管理中&#xff0c;應先進行移臂調度&#xff0c;再進行旋轉調度。假設磁盤移動臂位于21 號柱面上&#xff0c;進程的請求序列如下表所示。如果采用最短移臂調度算法&#xff0c;那么系統的響應 序列應為(D )。A.?②⑧③④⑤①⑦⑥⑨ …

數據庫的連接_qt

數據庫的連接形式可以通過cmd查看 1.獲取 UI 輸入的連接參數 // 獲取主機名&#xff08;如"localhost"或IP地址&#xff09; QString hostStr hostEdit->text(); // 從hostEdit控件獲取文本 QByteArray hostBa hostStr.toUtf8(); // 轉換為UTF-8編碼的字節數…

HTML 設計與使用入門

HTML 設計與使用入門 一、完整示例&#xff08;基礎頁面模板&#xff09;這是一個結構清晰、可直接拷貝運行的最小 HTML 模板&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"utf-8"><meta name"vie…

Gradio全解11——Streaming:流式傳輸的視頻應用(2)——Twilio:網絡服務提供商

Gradio全解11——Streaming&#xff1a;流式傳輸的視頻應用&#xff08;2&#xff09;——Twilio&#xff1a;網絡服務提供商11.2 Twilio&#xff1a;網絡服務提供商11.2.1 Twillo穿透服務與TURN服務器1. 什么是STUN、TURN和ICE&#xff1f;2. Twilio介紹及網絡穿透服務3. Twil…

【更新至2024年】2009-2024年各地級市金融科技水平數據

【更新至2024年】2009-2024年各地級市金融科技水平數據 1、時間&#xff1a;2009-2024年 2、來源&#xff1a;天眼查 3、指標&#xff1a;年份、省份、地級市、地級市代碼、當年新注冊金融科技公司數量、累計注冊金融科技公司數量、金融科技水平 4、范圍&#xff1a;地級市…

一般軟件加載顯示圖片的流程

目錄 1、一般圖片瀏覽軟件的流程&#xff08;Qt 或類似框架&#xff09;&#xff1a; 1?? 讀取原始數據 2?? 解析圖片格式 3?? 存儲到內部可用的繪制對象 4?? 顯示到界面 ? 總結 2、那什么叫“QPixmap 在 Qt 里就是“顯示專用的像素緩存”&#xff0c;不是原始…

【論文閱讀】REFRAG:一個提升RAG解碼效率的新思路

引言 看到一則報道[1]&#xff0c;重組后的Meta實驗室在9月1號發布了一篇關于提升RAG解碼效率的論文&#xff0c;提出的思路有點啟發作用&#xff0c;于是把原文下載下來仔細看下。 論文標題&#xff1a;REFRAG: Rethinking RAG based Decoding 論文地址&#xff1a;https://ar…

QT M/V架構開發實戰:QFileSystemModel介紹

目錄[TOC](目錄)前言一、QFileSystemModel初步介紹二、基本功能1.創建2.基本屬性與方法三、示例&#xff08;簡單的文件瀏覽器&#xff09;四、性能注意事項前言 本文主要介紹的是使用代碼生成的情況下對控件的介紹&#xff0c;包括擁有的功能及能修改的樣式&#xff0c;也會說…

視頻生成迎來效率革命!字節提出視頻生成稀疏注意力機制,計算量降20倍,速度升17.79倍!

論文鏈接&#xff1a;https://arxiv.org/pdf/2509.01085亮點直擊BSA——一種可訓練的雙向動態稀疏注意力框架&#xff0c;該框架首次在視頻擴散訓練中對全注意力機制中的查詢&#xff08;Query&#xff09;及鍵值對&#xff08;Key-Value&#xff09;進行正交稀疏化處理以加速訓…

STM32HAL庫_cubeMX

ADC簡介STM32f103的是12位逼近型ADC代碼連續非掃描模式&#xff08;1個通道&#xff09;1&#xff1a;校準ADC&#xff08;這個可要可不要&#xff09;2&#xff1a;ADC初始化3&#xff1a;配置ADC通道&#xff08;這個函數只有一個通道時就是可要可不要&#xff09;4&#xff…

【Qt】清空QDateTimeEdit

代碼 ui->startDate->setSpecialValueText(" "); //這里是空格 ui->startDate->setMinimumDate(QDate(2024, 1, 1)); ui->startDate->setDate(QDate::fromString("2024-01-01", "yyyy-MM-dd"));原理 設置特殊值顯示文本&#…

LiTS 2017 datasets

下載記錄 論文地址&#xff1a;https://doi.org/10.1016/j.media.2022.102680 官方下載鏈接&#xff1a;https://competitions.codalab.org/competitions/17094 進入鏈接后&#xff0c;需要先注冊才能拿到下載點擊Train data下面的Mirro1&#xff0c;在google云盤會看到Trai…