26. 刪除排序數(shù)組中的重復(fù)項(xiàng)
給定一個(gè)排序數(shù)組蛔垢,你需要在原地刪除重復(fù)出現(xiàn)的元素县习,使得每個(gè)元素只出現(xiàn)一次泵额,返回移除后數(shù)組的新長(zhǎng)度晾匠。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成梯刚。
示例 1:
給定數(shù)組 nums = [1,1,2],
函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且原數(shù)組 nums 的前兩個(gè)元素被修改為 1, 2。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素薪寓。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數(shù)應(yīng)該返回新的長(zhǎng)度 5, 并且原數(shù)組 nums 的前五個(gè)元素被修改為 0, 1, 2, 3, 4亡资。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
說(shuō)明:
為什么返回?cái)?shù)值是整數(shù)向叉,但輸出的答案是數(shù)組呢?
請(qǐng)注意锥腻,輸入數(shù)組是以“引用”方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的母谎。
你可以想象內(nèi)部操作如下:
// nums 是以“引用”方式傳遞的瘦黑。也就是說(shuō),不對(duì)實(shí)參做任何拷貝
int len = removeDuplicates(nums);
// 在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見的奇唤。
// 根據(jù)你的函數(shù)返回的長(zhǎng)度, 它會(huì)打印出數(shù)組中該長(zhǎng)度范圍內(nèi)的所有元素幸斥。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán)咬扇,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處甲葬。
解題思路1:
題目要求刪除重復(fù)的數(shù)字,也就是把不重復(fù)的數(shù)字往前移懈贺,因?yàn)椴恍枰紤]數(shù)組中超出新長(zhǎng)度后面的元素经窖。
運(yùn)用雙指針的方法來(lái)做。
一個(gè)指針為 i梭灿,指向第一個(gè)元素位置画侣,另一個(gè)指針為 j,指向第二個(gè)元素位置堡妒,判斷這兩個(gè)元素相不相等配乱,如果這兩個(gè)元素相等話,j 的位置加一,繼續(xù)判斷這兩個(gè)位置的元素相不相等宪卿,如果這兩個(gè)元素不相等的诵,將 j 位置上的元素賦值給 i +1位置上,j 的位置加一佑钾,直到 j 的位置等于數(shù)組的長(zhǎng)度西疤,最后返回 i+1 的值。
程序代碼1:
class Solution:
def removeDuplicates(self, nums):
if nums == 0:
return 0
i = 0
j = 1
while (j<len(nums)):
if (nums[i] != nums[j]):
i += 1
nums[i] = nums[j]
j += 1
else:
j += 1
return i+1
nums = [0,0,1,1,1,2,2,3,3,4]
s = Solution()
print(s.removeDuplicates(nums))
解題思路2:
因?yàn)槭怯行虻牧斜硇萑埽捎帽┝Ρ闅v代赁,從后往前遍歷,nums[i] 與 nums[i-1] 進(jìn)行比較兽掰,相等的話芭碍,刪除nums[i],直到遍歷完畢孽尽,返回?cái)?shù)組的長(zhǎng)度窖壕。
程序代碼2:
class Solution:
def removeDuplicates(self,nums):
for i in range(len(nums)-1,0,-1):
if nums[i] == nums[i-1]:
nums.pop(i)
return len(nums)
nums = [0,0,1,1,1,2,2,3,3,4]
s = Solution()
print(s.removeDuplicates(nums))