數論 C 003 移動元素(雙指標)

2021-09-25 23:15:23 字數 1621 閱讀 9476

給定乙個陣列nums和乙個值val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

給定nums = [0,1,2,2,3,0,4,2], val = 2,

返回新的長度 5, 並且nums中的前五個元素為0, 1, 3, 0, 4

注意:這5個元素可為任意順序。你不需要考慮陣列中超出新長度後面的元素。

既然問題要求我們就地刪除給定值的所有元素,我們就必須用 o(1)的額外空間來處理它。如何解決?資料結構就不能使用了,但我們可以保留兩個指標 i 和 j,其中i 是慢指標,j 是快指標

演算法當nums[j] == value,遞增 j 以跳過該元素。

nums[j] != value,我們就讓nums[i] = nums[j],並同時遞增兩個索引。

重複這一過程,直到j == nums.length,最後陣列的新長度為i

public

intremoveelement

(int

nums,

int val)

}return i;

}

在要移動的元素很少的情況下:比如nums = [1, 2, 3, 5 ,4]; value = 4。使用演算法1,將會移動不必要的步數。

又比如:num = [4,1,2,3,5],value = 4,沒有必要將[1,2,3,5]這幾個元素左移一步,因為問題描述中提到元素的順序可以更改。能不能減少 指標的移動次數呢?

演算法當我們遇到nums[i] == value時,我們可以將當前元素與最後乙個元素進行交換,並釋放最後乙個元素。這實際上使陣列的大小減少了 1。

問題:一提到釋放,可能會想,如果要刪除的元素在釋放位置怎麼辦?

:我們只是維護1個指標,當檢查出nums[i] != value,我們才移動指標i

這得也是依據題目中可讓結果陣列可不保證相對順序得出的演算法。

public

intremoveelement

(int

nums,

int value)

else i++;}

}

《002 兩個陣列的交集 ii》— 【hashmap】

《004 刪除排序陣列中的重複項》— 【雙指標】

C 003強制轉換

c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dynamic cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。reinterprete...

C 003 標示符介紹

什麼是標示符?1.程式設計師在自己程式內給某些物件起得名字,方便識別和區分,就好比張三和李四。2.注意點 a.不能和系統的關鍵字同名 b.起個能讓自己和比人都能看懂的 提高可讀性 標示符的作用 我的理解就是讓自己和別人都能看懂我寫的到底代表誰。命名規則 重點 1.只能由26個英文本母的大小寫 10個...

C 數論 數列

描述 當然是這個辣 你得學會高精度數除以低精度數,當然,能用壓位高精最好 親測極限資料壓位高精慢了整整7ms 俗話說得好,數學上來先打表,於是 1.1 2.12 3.121 4.1213 5.12131 6.121312 7.1213121 8.12131214 9.121312141 10.121...