1.原地移除所有數(shù)值等于val的元素
LeetCode27.給你一個數(shù)組nums和一個值val,你需要原地移除所有數(shù)值等于val的元素,并返回移除后數(shù)組的新長度。要求:不要使用額外的數(shù)組空間,你必須僅使用?O(1)
?額外空間并?原地?修改輸入數(shù)組。元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。
示例1:
輸入:nums = [3,2,2,3], val = 3 輸出:2, nums = [2,2] 解釋:函數(shù)應(yīng)該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。你不需要考慮數(shù)組中超出新長度后面的元素。例如,函數(shù)返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums =[2,2,0,0]也會被視作正確答案。
示例2:?
輸入:nums = [0,1,2,2,3,0,4,2], val = 2 輸出:5, nums = [0,1,4,0,3] 解釋:函數(shù)應(yīng)該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。注意這五個元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。
這道題可以用兩種不同的雙指針方式解決,具體如下:
1.1 快慢雙指針?
首先定義兩個指針slow和fast,初始值都是0,slow之前的位置是有效部分,fast表示當(dāng)前要訪問的元素,遍歷時,fast不斷向后移動:
- 如果nums[fast]的值不為val,則將其移動到nums[slow++]處。
- 如果nums[fast]的值為val,則fast繼續(xù)向前移動,slow先等待。
圖示如下:
fast遍歷之后,slow之前的部分為有效部分,代碼如下:
int removeElement(int* nums, int numsSize, int val)
{
int slow = 0;
for (int fast = 0; fast < numsSize; fast++)
{
if (nums[fast] != val)
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
1.2 對撞雙指針?
這個方法的核心思想是從右側(cè)找到不是val的值來代替左側(cè)是val的值,假如nums = [0,1,2,2,3,0,4,2],val =2,如圖所示:
代碼如下:
int removeElement(int* nums, int numsSize, int val)
{
int left = 0;
int right = numsSize - 1;
while (left <= right)
{
if (nums[left] == val && nums[right] != val)
{
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
else if (nums[left] == val && nums[right] == val)
{
right--;
}
else if (nums[left] != val)
{
left++;
}
}
return left;
}
2.刪除有序數(shù)組中的重復(fù)項(xiàng)?
?LeetCode26 給你一個有序數(shù)組nums,請你原地刪除重復(fù)出現(xiàn)的元素,使每個元素只出現(xiàn)一次,返回刪除后數(shù)組的新長度。元素的?相對順序?應(yīng)該保持?一致?。然后返回?nums
?中唯一元素的個數(shù)。
示例1:
輸入:nums = [1,1,2] 輸出:2, nums = [1,2] 解釋:函數(shù)應(yīng)該返回新的長度 2,并且原數(shù)組 nums 的前兩個元素被修改為 1, 2 。不需要考慮數(shù)組中超出新長度后面的元素。
示例2:?
輸入:nums = [0,0,1,1,1,2,2,3,3,4] 輸出:5, nums = [0,1,2,3,4] 解釋:函數(shù)應(yīng)該返回新的長度 5 , 并且原數(shù)組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。不需要考慮數(shù)組中超出新長度后面的元素。
?這道題與上道題類似,也可以使用雙指針解決,代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-638742.html
int removeDuplicates(int* nums, int numsSize){
int slow = 1;
for(int fast = 1;fast < numsSize;fast++)
{
if(nums[fast] != nums[slow - 1])
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
我們可以設(shè)置slow和fast兩個指針,fast指針用來遍歷數(shù)組,slow指針用來保存有效位置,我們用fast與slow-1進(jìn)行比較,如果二者不相等,我們就可以將fast的值賦給slow,因?yàn)檫@樣可以保證slow與slow-1的值一定不相等。文章來源地址http://www.zghlxwxcb.cn/news/detail-638742.html
到了這里,關(guān)于算法通關(guān)村——刪除元素專題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!