【 順序表經典算法—移除元素和合并兩個有序數組】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

目錄

前言

經典算法OJ題1: 移除元素

解法一、逐個判斷

解法二、雙指針覆蓋

經典算法OJ題2: 合并兩個有序數組

OJ題分為兩個類型:

總結


前言

世上有兩種耀眼的光芒,一種是正在升起的太陽,一種是正在努力學習編程的你!一個愛學編程的人。各位看官,我衷心的希望這篇博客能對你們有所幫助,同時也希望各位看官能對我的文章給與點評,希望我們能夠攜手共同促進進步,在編程的道路上越走越遠!


提示:以下是本篇文章正文內容,下面案例可供參考

經典算法OJ題1: 移除元素

給你一個數組 nums?和一個值?val,你需要?原地?移除所有數值等于?val?的元素,并返回移除后數組的新長度。不要使用額外的數組空間,你必須僅使用?O(1)?額外空間并?原地?修改輸入數組。元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。

首先要想清楚移除的本質并不是真刪除,而是把元素覆蓋即可,覆蓋n個元素后,數組總長度就要-n

解法一、逐個判斷

把數組從頭開始遍歷,找到目標元素val,就執行一次任意位置刪除

注意: 在實際寫代碼時,每刪除一次元素,i 都要回退一次,因為有的測試用例是 3 3 3 3,val = 3,如果不回退,直接覆蓋,會少刪兩個元素。

代碼演示:

void Erase(int* nums, int pos, int len)
{assert(len > 0);while (pos < len){nums[pos] = nums[pos + 1];//數組中后面的數據把前面的數據覆蓋pos++;//向后移動}
}
int removeElement(int* nums, int numsSize, int val)
{assert(nums);  //nums不能為空指針int i = 0;int len = numsSize;//數組的有效元素個數for (i = 0; i < len; i++){if (nums[i] == val){Erase(nums, i, len);i--;//這里i--是因為后面的值把i所在的位置覆蓋,//如果不--,出了這個循環,i++, 就會把再i上賦的值給忽略,少判斷一次len--;}}return len;//返回的是刪除之后的數組長度
}

解法二、雙指針覆蓋

這是一種比較巧妙的解法,用到了雙指針 ,對數組內元素進行覆蓋,具體實現為:存在兩個指針src?、dst?,兩者初始都指向數組起始位置,遍歷 整個數組,對指針 src?和指針 dst?所指向的值進行比較,如果 *src?!= val ,就把 *src?賦給 *dst?,然后 dst?向后移動,當然無論相等還是不相等,src?都需要往后移動,這個解法的目的就是把數組中所有非目標值的元素往前移動,最后返回?dst 的下標(dst的下標就是數組中不等于 val 的值的個數)

代碼演示:

int removeElement(int* nums, int numsSize, int val) {int src = 0;int dst = 0;while (src < numsSize){if (nums[src] == val){src++;}else{nums[dst] = nums[src];dst++;src++;}}return dst;
}

經典算法OJ題2: 合并兩個有序數組

給你兩個按?非遞減順序?排列的整數數組?nums1?和?nums2,另有兩個整數?m?和?n?,分別表示?nums1?和?nums2?中的元素數目。請你?合并?nums2?到?nums1?中,使合并后的數組同樣按?非遞減順序?排列。

注意:最終,合并后數組不應由函數返回,而是存儲在數組?nums1?中。為了應對這種情況,nums1?的初始長度為?m + n其中前?m?個元素表示應合并的元素,后?n?個元素為?0?,應忽略。nums2?的長度為?n?。

nums1
數組123000
下標012345
nums2
數組256
下標012

假設比小的思路:設L1為nums1數組的起始位置,L2為nums2數組的起始位置,我們從比小的角度看,L1為1時,L2為2,L2大;L1++,此時L1為2,L2為2,我們假設還是L1的2大;L1++,此時L1為3,L2為2,我們把L2的值賦給L1,那么原來L1位置上的3就沒了,所以這種比小的思路是不行的。

假設比大的思路:設L1為nums1數組實際有效數據的最后一個元素(下標為2),L3為nums1數組初始化的最后一個位置(下標為5);L2為nums2數組的最后一個元素;L2為6時,L1為3,L2賦值給L3,L2--,L3--,L2不變;L2為5時,L1為3,L2賦值給L3,L2--,L3--,L1不變;L2為2時,L1為3,此時L1賦值給L3,L3--,L1--;L2為2,L1為2,假設L2的2比L1的2要大,L2賦值給L3,L3--,L2--;此時L2已經完成循環,所以比大的思路時正確的。

此外,我們仍需要考慮兩種情況:L2先出循環和L1先出循環

上面的比大思路就是我們的L2先出循環,沒有是什么好考慮的。

我們來看L1先出循環的情況:

nums1
數組456000
下標012345
nums2
數組123
下標012

仍然是比大的思路:L2為3時,L1為6,L1的值賦給L3,L1--,L3--,L2不變;L2為3時,L1為5,L1的值賦給L3,L3--,L1--,L2不變;L1為4時,L2為3,L1的值賦給L3,L3--,L1--,L2不變;此時L1先完成循環,但是L2的數據還在原位,因為都是遞增的排序,那么只需要把L2數組的元素賦值給L3中。

代碼演示:

void merge(int* nums1, int m, int* nums2, int n) 
{int l1 = m - 1, l2 = n - 1;int l3 = m + n - 1;while (l1 >= 0 && l2 >= 0){if (nums1[l1] > nums2[l2]){nums1[l3] = nums1[l1];l1--;l3--;}else{nums1[l3] = nums2[l2];l3--;l2--;}}while (l2 >= 0){nums1[l3] = nums2[l2];l3--;l2--;}
}

OJ題分為兩個類型:

1:接口型(不需要main()函數,我們把代碼提交之后,后端會自動拼接main()函數)

2:IO型(需要main()函數)


總結

好了,本篇博客到這里就結束了,如果有更好的觀點,請及時留言,我會認真觀看并學習。
不積硅步,無以至千里;不積小流,無以成江海。

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

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

相關文章

MAX/MSP SDK學習07:list傳遞

實現自定義Obejct&#xff0c;要求將傳入的一組數據100后傳出。 #include "ext.h" #include "ext_obex.h" typedef struct _listTrans {t_object ob;void* outLet;t_atom* fArr;long listNum;} t_listTrans;void* listTrans_new(t_symbol* s, long arg…

14.Python 模塊

目錄 1. 使用模塊2. 使用包3. 常用模塊3.1 日期和時間3.2 偽隨機數3.3 摘要算法3.4 JSON 處理3.5 圖像處理 模塊是Python用來組織代碼的一種方法&#xff0c;包是Python用來組織模塊的一種方法。 1. 使用模塊 Python 把能夠相互包含&#xff0c;且有組織的代碼段稱為模塊&…

.NET面試題1

1.什么是C#&#xff1f; C#&#xff08;讀作"C sharp"&#xff09;是一種通用的、面向對象的編程語言&#xff0c;由Microsoft開發。它是一種靜態類型語言&#xff0c;支持強類型檢查和面向對象編程&#xff08;OOP&#xff09;的概念。C#主要用于開發Windows應用程序…

Bug等級劃分

Bug是指在程序或系統中存在的錯誤、缺陷或異常&#xff0c;是由于編碼錯誤、設計問題、邏輯錯誤或其他因素導致的。 常見的Bug分類方法 功能性Bug與軟件的功能有關&#xff0c;軟件無法正常工作、功能與需求不符或功能執行不正確。 用戶界面Bug與軟件的用戶界面有關&#xff…

Unity中Shader雙向反射分布函數BRDF

文章目錄 前言一、渲染方程二、什么是BxDF1、BSSRDF2、BRDF3、BTDF4、BSDF 三、迪士尼原則的BRDF四、迪士尼原則的BRDF的參數五、在Unity中看一下默認Shader的這些參數六、在這里記錄一下使用 Blender 和 SubstancePainter 的流程1、在Blender中導出模型為 .obj 格式2、在Subst…

Android WMS—— Surace管理 (二十)

WMS 負責創建 Surface 以及對 Surface 的擺放工作,之后將 Surface 提交給SurfaceFlinger 進行合并。在 App 層也創建了一個 Surface 對象,但是那個是空對象,用于 WMS 的填充。 一、Surface的創建 首先 APP 層在 ViewRootImpl 的 relayoutWindow() 方法中發起創建任務。 1、…

Go 實現網絡代理

使用 Go 語言開發網絡代理服務可以通過以下步驟完成。這里&#xff0c;我們將使用 golang.org/x/net/proxy 包來創建一個簡單的 SOCKS5 代理服務作為示例。 步驟 1. 安裝 golang.org/x/net/proxy 包 使用以下命令安裝 golang.org/x/net 包&#xff0c;該包包含 proxy 子包&am…

天軟特色因子看板 (2023.11 第12期)

該因子看板跟蹤天軟特色因子A05006(近一月單筆流入流出金額之比(%)&#xff0c;該因子為近一個月單筆流入流出金額之比(%)均值因子&#xff0c;用以刻畫在 市場日內分時成交中流入、流出成交金額的差異性特點&#xff0c;發掘市場主力資金的作用機制。 今日為該因子跟蹤第12期&…

expect腳本在自動化部署中的具體應用案例

#expect腳本在自動化部署中的具體應用 expect腳本是一個非常好的交互式應用腳本&#xff0c;在自動化部署中&#xff0c;可以使用這個腳本來實現全自動的自動化部署。下面是一些具體的應用案例。 場景一&#xff1a;自動安裝mysql 可以使用expect腳本來實現mysql自動安裝&…

Windows平臺Unity下實現camera場景推送RTMP|輕量級RTSP服務|實時錄像

技術背景 我們在對接Unity平臺camera場景采集的時候&#xff0c;除了常規的RTMP推送、錄像外&#xff0c;還有一些開發者&#xff0c;需要能實現輕量級RTSP服務&#xff0c;對外提供個拉流的RTSP URL。 目前我們在Windows平臺Unity下數據源可采集到以下部分&#xff1a; 采集…

@PostConstruct雖好,請勿亂用

1.問題說明 在日常的業務開發中&#xff0c;有時會利用PostConstruct在容器啟動時執行一些任務。例如&#xff1a; PostConstruct public void init(){System.out.println("service 初始化..............."); }一般情況這沒什么問題&#xff0c;但最近一個同事在做…

ui5使用echart

相關的代碼已經發布到github上。 展示下相關的實現功能 1、柱狀圖-1 2、柱狀圖-2 3.折線圖 4.餅狀圖 如何使用&#xff1a; 使用git clone項目到本地 git clone https://github.com/linhuang0405/com.joker.Zechart找到index.html。在vscode里右鍵選擇Open with Live Serve…

1

【任務 1】私有云服務搭建[10 分] 【題目 1】基礎環境配置[0.5 分] 【題目 2】Yum 源配置[0.5 分] 【題目 3】配置無秘鑰 ssh[0.5 分] 【題目 4】基礎安裝[0.5 分] 【題目 5】數據庫安裝與調優[0.5 分] 【題目 6】Keystone 服務安裝與使用[0.5 分] 【題目 7】Glance 安裝與使用…

BLE通用廣播包

文章目錄 1、藍牙廣播數據格式2、掃描響應數據 1、藍牙廣播數據格式 藍牙廣播包的最大長度是37個字節&#xff0c;其中設備地址占用了6個字節&#xff0c;只有31個字節是可用的。這31個可用的字節又按照一定的格式來組織&#xff0c;被分割為n個AD Structure。如下圖所示&…

npm命令

node -v --查看版本 npm install --安裝npm npm config get registry --查看npm當前鏡像 npm config set registry https://registry.npmmirror.com --設置淘寶鏡像 npm版本管理工具

VS Code 如何搭建C/C++環境

目錄 一、VS Code是什么&#xff1f; 二、VS Code下載和安裝 2.1下載 2.2安裝 2.3環境介紹 三、Vs Code配置C/C環境 3.1下載和配置MinGW-w64編譯器套件 3.1.1下載 3.1.2配置 一、VS Code是什么&#xff1f; 跨平臺&#xff0c;免費且開源的現代輕量級代碼編輯器 Vis…

【MATLAB源碼-第85期】基于farrow結構的濾波器仿真,截止頻率等參數可調。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 Farrow結構是一種用于實現可變數字濾波器的方法&#xff0c;尤其適用于數字信號處理中的采樣率轉換和時變濾波。它通過多項式近似來實現對濾波器系數的平滑變化&#xff0c;使得濾波器具有可變的群延時或其他參數。 Farrow結…

mysql中數據是如何被用B+樹查詢到的

innoDB是按照頁為單位讀寫的 那頁中有很多行數據&#xff0c;是怎么執行查詢的呢&#xff0c;首先我們肯定&#xff0c;是以單向列表形式存儲的&#xff0c;提高了增刪的效率&#xff0c;但是查詢效率低。所以實際上對頁中的行數據進行了優化&#xff0c;能以二分的方式進行查…

Mac Goland無法調試

去github上下載golang的debug工具delve&#xff1a; go-delve/delve?github.com/go-delve/delve/blob/master/Documentation/installation/README.md?編輯 或者: go install github.com/go-delve/delve/cmd/dlvlatest按照他的安裝方式進行安裝&#xff0c;最后會在本地的…

基于北方蒼鷹算法優化概率神經網絡PNN的分類預測 - 附代碼

基于北方蒼鷹算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于北方蒼鷹算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于北方蒼鷹優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神…