目錄
- 一、移除元素
- 二、刪除有序數組中的重復項
- 三、合并兩個有序數組
- 總結
一、移除元素
移除元素 - 力扣
思路一:就是創建一個臨時數組,對原數組進行遍歷,找出與val不同的數據放到新數組里,然后再將tmp中的數據導回原數組
這個思路的復雜度很好猜,空間復雜度為O(N),時間復雜度為O(N)
但是
int tmp[numsSize];
這里是變長數組,某些編譯器上是不支持變成數組的,比如說msvc,這里使用動態內存開辟空間更好
而且該題目說要原地移除,這種方法是使用了一個臨時數組,也是不太符合題目的
思路二:雙指針法,創建兩個變量 dst,src
src在前面探路(找非val值)
dst在后面站崗(保存非val值)
- 如果src指向的數據是val,src++
- 如果src指向的數據不是val,賦值(src指向的值給dst),src和dst都++
結果只保證前dst個數據為2,剩下的不管
二、刪除有序數組中的重復項
刪除有序數組中的重復項 - 力扣
思路1:創建新數組,遍歷原數組,將不重復數據導入新數組中,再將新數組中的數據導入到原數組中
因為涉及不重復數據的導入,所以要定義兩個變量來遍歷,初始化i=j,第一個數據直接拿,接下來j++,此時i==j,i和j整體++,接下來i和j不相等,不相等把j向新數組中放,之后i與j再++
此時j越界,將新數組數據導入原數組中
前兩個數據是唯一的數據,滿足題目要求
該思路的唯一一個小問題也是沒有在原數組的基礎上進行操作,且很好猜時間和空間復雜度為O(n)
于是就有了思路2:
依舊是使用雙指針法:創建兩個變量,分別指向數組起始和下一個位置
- 如果src的值和dst的值相等,src++
- 如果src的值和dst的值不相等,dst++,賦值,src++
最后src越界,當前數組里的值2,3,3,3,前兩個數據是2,3,滿足題意
dst指向下標為1的數據,此時返回dst+1
示例二按該思路推導結果如下,也是滿足的,前5個數據是唯一的數據
代碼如圖
優化1
如圖剛開始src!=dst,dst++再src給dst賦值,此時的賦值就非常多余
所以有了如下代碼:
由于兩個if嵌套是且的關系,所以還可以優化
三、合并兩個有序數組
合并兩個有序數組 - 力扣
思路1:
先合并數組,再對nums1進行排序,可以使用冒泡排序,不過時間復雜度較高,為O(N2)
思路2:類似于尾插操作,從后往前遍歷數組,找大(誰大誰先往后放)
這里定義l1,l3為nums1的下標,l1放到有效數據的最后一個位置。l3指向m+n-1這個位置,是用來存放數據的位置,l2為nums2的下標,指向n-1的位置
首先l1與l2比較,因為6大,所以6存放到l3的位置,之后l2,l3減減
此時l1與l2比較,l2大,5放到l3位置,放完之后l2,l3再減減
同樣推理操作后,l1大,l1,l3減減
此時l1,l2均為2,假設l2的數字大,將2放到l3的位置
此時l2,l3再減減,此時l2越界,nums1已有序,且nums2先越界,也有相反的情況
同樣的思路,l1與l2相比,6放l3的位置,此時l1與l3減減
l1與l2再比較,5大放l3,l1與l3減減
同樣思路,如圖步驟之后l2,l3減減
此時假設l1大,放到l3的位置
之后l1,l3減減,此時l1已經越界,跳出循環,此時nums2中還有兩個數據沒有放到第一個數組中,此時只需將剩下兩個數據循環放到nums1中即可
此時也是有序的
代碼如下:
總結
以上就是數據結構順序表相關算法題的內容了,這些算法題的代碼普遍很簡答,主要就是在思考上。喜歡的靚仔靚女們不要忘記一鍵三連給予支持哦~