LC27移除元素 雙索引移動

2021-10-10 02:53:07 字數 1621 閱讀 5646

題目

給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須僅使用 o(1) 額外空間並 原地 修改輸入陣列。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

示例 1:

給定 nums = [3,2,2,3], val = 3,

函式應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。

你不需要考慮陣列中超出新長度後面的元素。

示例 2:

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

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

注意這五個元素可為任意順序。

你不需要考慮陣列中超出新長度後面的元素。

說明:為什麼返回數值是整數,但輸出的答案是陣列呢?

請注意,輸入陣列是以「引用」方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。

你可以想象內部操作如下:

// nums 是以「引用」方式傳遞的。也就是說,不對實參作任何拷貝

int len = removeelement(nums, val);

// 在函式裡修改輸入陣列對於呼叫者是可見的。

// 根據你的函式返回的長度, 它會列印出陣列中 該長度範圍內 的所有元素。

for (int i = 0; i < len; i++)

思路看到這個題目第一感覺不是很難,最簡單的思路就是從左至右進行遍歷nums,遇到等於val的nums[i],就用nums[i] = nums[i + 1]進行覆蓋。

**實現:

public

intremoveelement

(int

nums,

int val)

c ++

; nums[nums.length -1]

= integer.min_value;

}else

}return nums.length - c;

}

複雜度分析

空間複雜度 1 ,時間複雜度因為每次遇到值都會遍歷一遍後面的值,因此是n^2的複雜度。

演算法改進

很現在這種演算法的時間複雜度過高,有更好的時間複雜度,一次遍歷即可。可以維護兩個指標,乙個是遍歷nums陣列的索引i,乙個是賦值的索引j,這樣遇到val != nums[i]的值j才移動,這樣即可達到目標。

**實現:

public

intremoveelement

(int

nums,

int val)

return j;

}

複雜度分析

時間複雜度為n,空間複雜度為1。很顯然這樣的演算法時間複雜度更好,可閱讀性也更好更簡潔,**的表達力更強。

Lc27 移除元素

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

LC27陣列內元素的去除精妙演算法

27。移除元素 題目 給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素 給定 nums 0,1,2,2,3,0,4,2 val 2,函式應該返回新的長度 5,並且 nums ...

陣列 27 移除元素(雙指標法)

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