【初階數據結構】順序表OJ題講解

前言?

📚作者簡介:愛編程的小馬,正在學習C/C++,Linux及MySQL。

📚本文收錄與初階數據結構系列,本專欄主要是針對時間、空間復雜度,順序表和鏈表、棧和隊列、二叉樹以及各類排序算法,持續更新!

📚相關專欄C++及Linux正在發展,敬請期待!

目錄

前言?

1.?順序表的基礎OJ題講解

1.1 第一題?

1.2 第二題?

1.3 第三題?

1.4 第四題?

總結


1.?順序表的基礎OJ題講解

1.1 第一題?

首先說明需要使用leetcode力扣這個平臺進行算法的練習,第一道題的OJ鏈接我放在這里,同學們點進去就可以做題了:移除元素

題目描述:

給你一個數組?nums?和一個值?val,你需要原地移除所有數值等于?val?的元素,并返回移除后數組的新長度。

不要使用額外的數組空間,你必須僅使用?O(1)?額外空間并原地修改輸入數組

題目分析:?

這道題實際上考查的是不開辟新的數組空間,能不能在原數據上操作就可以完成刪除。

我給同學們提供一個思路,供你們參考

??

?首先建立兩個指針,都指向數據的首元素的位置,然后src依次往后走,?如果和val相同我就跳過,如果不同我就把這個位置的元素拷貝到dst指向的位置,然后dst往后走,src往后走,遍歷完成了,是不是返回dst就可以了,我們一起來實現一下這個代碼:??

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++];}}return dst;
}

?1.2 第二題?

第二題的OJ鏈接:刪除有序數組中的重復項?

?題目描述:

給你一個非嚴格遞增排列的數組?nums?,請你原地刪除重復出現的元素,使每個元素只出現一次?,返回刪除后數組的新長度。元素的?相對順序?應該保持?一致?。然后返回?nums?中唯一元素的個數。

  • 更改數組?nums?,使?nums?的前?k?個元素包含唯一元素,并按照它們最初在?nums?中出現的順序排列。nums?的其余元素與?nums?的大小不重要。
  • 返回?k?。

?題目思路:

這道題雖然提示了說需要原地刪除,但是沒有限定完全空間復雜度,所以使用新數組也能過,但是我在這里給大家講解一種新的方法,原地刪除。

??

就是src1 和 src2用于遍歷數組,當src1和src2的數據元素值不同時,就把src1的值拷貝給dst,然后dst往后走一步,這時候再把src2拷貝給src1繼續遍歷是不是就完成了?一起來看下代碼:?

int removeDuplicates(int* nums, int numsSize) 
{int src1 = 0;int src2 = 1;int dst = 0;while(src2<numsSize){if(nums[src2] != nums[src1]){nums[++dst] = nums[src2];src1 = src2;}else{src2++;}}return dst+1;
}

?1.3 第三題?

?第三題的OJ鏈接:合并兩個有序數組

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

請你合并?nums2?到?nums1?中,使合并后的數組同樣按非遞減順序排列。

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

題目分析:?

這道題也是希望不開辟新數組,就在原數組中完成合并。很多同學就說了,是不是我可以先把兩個數組合并,再用快排qsort排序就可以了?其實不行,為什么呢?qsort的時間復雜度是O(N)=N*logN,在OJ題肯定過不去,那我們有沒有辦法在O(N)的時間復雜度下完成這個算法呢?

??

?這樣子可不可以,其實不行。同學們想一想,如果我按照題意如果我再nums1,可能是從后往前插入,如果從前往后是會造成數據的覆蓋的,那么我們是不是從后往前遍歷,依次比較是不是就可以。??

??

然后還有一個點,就是如果nums2先結束,那沒問題,輸入nums1即可,但是nums1先結束呢?是不是還需要把nums2之后的值拷貝到nums1中,結束為止,在輸出nums1,對不對,這樣是不是就可以了?同學們一起看下代碼:?

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int end1 = m-1;int end2 = n-1;int i = m+n-1;while(end1>=0 && end2 >=0){if(nums1[end1]>nums2[end2]){nums1[i--] = nums1[end1--];}else{nums1[i--] = nums2[end2--];}}while( end2 >= 0 ){nums1[i--] = nums2[end2--];}
}

1.4 第四題?

第四題的OJ鏈接:?消失的數字

題目描述:數組nums包含從0n的所有整數,但其中缺了一個。請編寫代碼找出那個缺失的整數。你有辦法在O(n)時間內完成嗎?

題目分析:

這道題可以用暴力解決的,就是我把新數組和i依次遍歷比較,找出那個不相等的,然后返回就可以了,這個的時間復雜度是多少,其實是O(N) = N^2,肯定是過不去的。

那我們可以使用一個很巧的方法,是異或法,怎么操作呢?因為異或有個很好的特性是相同為0,所以分別異或兩次是不是就可以找到了?比方說看我這個圖:

??

代碼:


int missingNumber(int* nums, int numsSize)
{int ret = 0;for(int i = 0; i<numsSize;i++){ret ^= nums[i]; }for(int i = 0; i<numsSize+1;i++){ret ^= i; }return ret;
}

總結

1、同學們一定要將這次講的題都自己做一遍,對順序表會有更好的理解

2、算法題和我們之前刷的牛客網題還不一樣,大家一開始要適應

如果這份博客對大家有幫助,希望各位給小馬一個大大的點贊鼓勵一下,如果喜歡,請收藏一下,謝謝大家!!!
制作不易,如果大家有什么疑問或給小馬的意見,歡迎評論區留言。

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

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

相關文章

基于ambari hdp的kafka用戶授權讀寫權限

基于ambari hdp的kafka用戶授權讀寫權限 版本Kafka 2.0.0添加自定義配置修改admin密碼重啟kafka授權讀取授權寫入有效通配符部分舉例 版本Kafka 2.0.0 添加自定義配置 authorizer.class.name kafka.security.auth.SimpleAclAuthorizer super.users User:admin allow.everyo…

【LLM 論文】Step-Back Prompting:先解決更高層次的問題來提高 LLM 推理能力

論文&#xff1a;Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ???? Google DeepMind, ICLR 2024, arXiv:2310.06117 論文速讀 該論文受到的啟發是&#xff1a;人類再解決一個包含很多細節的具體問題時&#xff0c;先站在更高的層次上解…

Android 屏幕適配全攻略(上)-掌握屏幕單位,應對千變萬化的設備

本文從 Android 開發中常見的長度單位 px、dp、sp 入手&#xff0c;詳細介紹了它們的特點及轉換關系。 接著深入探討了屏幕尺寸、分辨率、像素密度等重要的屏幕指標&#xff0c;幫助讀者全面理解它們之間的聯系。最后&#xff0c;通過實例代碼演示了如何在代碼中進行單位轉換&…

三分鐘上手安全滲透系統Kali Linux

kali linux系統集成了常用的安全滲透工具&#xff0c;省去了安裝工具的時間&#xff0c;做安全相關的工作是非常推薦使用的。 安裝Kalii Linux 安裝系統 一般使用虛擬機進行安裝&#xff0c;Kali Linux基于Debian內核&#xff0c;虛擬機的操作系統選擇Debian 7.x 64 選擇系統…

【SRC實戰】一鍵完成全部任務獲取獎勵

挖個洞先 https://mp.weixin.qq.com/s/LkPfJuuP1K8vaFXRn-8wVg “ 以下漏洞均為實驗靶場&#xff0c;如有雷同&#xff0c;純屬巧合 ” 01 — 漏洞證明 一、業務邏輯 “ 如何欺騙APP完成任務獲取獎勵&#xff1f; ” 1、記錄金幣數量20 2、瀏覽商品詳情頁 3、點擊瀏覽提…

我們應該如何做參與式觀察

記得多年以前&#xff0c;有個朋友問我&#xff1a;對于做觀察&#xff0c;有人通過教授繪畫技巧來教人如何做觀察。你們研究員又不會畫畫&#xff0c;你們如何讓人相信你們更會觀察呢&#xff1f;坦率說&#xff0c;當時我被問住了&#xff0c;因為我從來沒有進行過這樣的對比…

day5Qt作業

服務器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//準備組件&#xff0c;初始化組件狀態this->setFixedSize(800,600);chatwidget new QListWidge…

代碼隨想錄算法訓練營第四十九天| 123.買賣股票的最佳時機III,188.買賣股票的最佳時機IV

目錄 題目鏈接&#xff1a;123.買賣股票的最佳時機III 思路 代碼 題目鏈接&#xff1a;188.買賣股票的最佳時機IV 思路 代碼 總結 題目鏈接&#xff1a;123.買賣股票的最佳時機III 思路 與之前買賣股票不同的是本題要求最多買賣兩次&#xff0c;那么dp數組以及遞推公式都…

攻擊者正在利用AI,對保險公司發起大規模欺詐

保險欺詐一直是保險行業面臨的重要挑戰之一&#xff0c;尤其隨著技術的進步&#xff0c;欺詐者也在不斷更新其手段&#xff0c;利用AI技術&#xff0c;包括生成式模型、機器學習和數據分析工具等欺騙保險公司&#xff0c;而AI技術的應用正成為他們的新工具&#xff0c;使其犯罪…

如何打造個人IP?

打造個人IP&#xff08;Intellectual Property&#xff09;是當今社會中越來越受到關注的話題。個人IP指的是個人在某個領域內所擁有的獨特的、具有商業價值的知識、技能、品牌和影響力。為什么要打造個人IP&#xff1f;如何打造個人IP&#xff1f;下面我將為您詳細解答。 首先…

Navicat連接遠程數據庫時,隔一段時間不操作出現的卡頓問題

使用 Navicat 連接服務器上的數據庫時&#xff0c;如果隔一段時間沒有使用&#xff0c;再次點擊就會出現卡頓的問題。 如&#xff1a;隔一段時間再查詢完數據會出現&#xff1a; 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

LinkedList鏈表

LinkedList 的全面說明 LinkList底層實現了雙向鏈表和雙端隊列特點可以添加任意元素&#xff08;元素可以重復&#xff09;&#xff0c;包括null線程不安全&#xff0c;沒有實現同步 LinkedList 的底層操作機制 LinkedList底層維護了一個雙向鏈表LinkList中維護了兩個屬性fi…

【算法入門賽】A.坐標變換(推薦學習)C++題解與代碼

比賽鏈接&#xff1a;https://www.starrycoding.com/contest/8 題目描述 武漢市可以看做一個二維地圖。 牢 e e e掌握了一項特異功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分別設定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置會…

【Fastadmin】表格列改input框輸入編輯,以排序權重為例

目錄 1.自定義權重排序,以字段sort為例 js列代碼 在// 初始化表格table.bootstrapTable({ });的后面添加事件 api里面增加formatter方法,如果存在角色權限問題,控制器添

谷歌外鏈怎么發?

既要數量也要質量&#xff0c;要保證你的鏈接廣泛分布&#xff0c;在數量上&#xff0c;確實需要你的鏈接在各種平臺上有所展現&#xff0c;這樣能提升你網站的知名度和曝光率&#xff0c;但是&#xff0c;光有數量是不夠的&#xff0c;如果這些鏈接的內容不行&#xff0c;那對…

ARIMA模型在河流水質預測中的應用_含代碼

#水質模型 #時間序列 #python應用 ARIMA 時間序列模型簡介 時間序列是研究數據隨時間變化而變化的一種算法&#xff0c;是一種預測性分析算法。它的基本出發點就是事物發展都有連續性&#xff0c;按照它本身固有的規律進行。ARIMA(p,d,q)模型全稱為差分自回歸移動平均模型 (A…

SSH文件傳輸

一、設置SSH密鑰對&#xff0c;實現記住密碼 要避免每次使用scp或ssh時都輸入密碼&#xff0c;你可以設置SSH密鑰對&#xff08;一對公鑰和私鑰&#xff09;&#xff0c;并將公鑰添加到遠程服務器上。這樣&#xff0c;你的系統可以通過密鑰自動驗證身份&#xff0c;而無需手動…

Blazor入門-基礎知識+vs2022自帶例程的理解

參考&#xff1a; Blazor 教程 - 生成首個應用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基礎知識&#xff1a;Visual Studio 2022 中的Blazor開發入門_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

NSSCTF | [SWPUCTF 2021 新生賽]jicao

打開題目&#xff0c;發現高亮顯示了一個 php 腳本 這是腳本的內容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

idea中數據庫的連接(保姆級)

點擊idea中的database 然后再點擊加號 創建 然后選擇第一欄data source 再選擇mysql 然后選擇數據庫的連接方式 再輸入密碼 這里我們本來就是localhost所有就不用改 選擇端口號 然后點擊Test Connection 測試連接 第一次連接會下載連接的文件 我們只需要 等待它下載完成就好了 …