国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法通關(guān)村——刪除元素專題

這篇具有很好參考價值的文章主要介紹了算法通關(guān)村——刪除元素專題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

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先等待。

圖示如下:

算法通關(guān)村——刪除元素專題,算法,c語言,數(shù)據(jù)結(jié)構(gòu)

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,如圖所示:

算法通關(guān)村——刪除元素專題,算法,c語言,數(shù)據(jù)結(jié)構(gòu)

代碼如下:

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ù)組中超出新長度后面的元素。

?這道題與上道題類似,也可以使用雙指針解決,代碼如下:

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包