叨逼叨
默認每天都要刷兩道題。
今天目標已完成。
第一題
26. 刪除排序數組中的重復項
難度:簡單
類型:數組
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。
這題其實我之前做過,但是一直提交失敗。
經過昨天的那題數組題,我換了一種for in方式。
之前我采用的是下標來定位,用pop
來刪除重復項。
這次采用了數組內的每一項來單獨做對比,用remove
來進行刪除操作。
class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""length = len(nums)if length > 1: \\這個判定很重要point = nums[0]for i in nums[1:]:if point != i:point = ielse:nums.remove(i)print(len(nums))
其中的if length > 1是后面進行修改的,是必須的判定。
因為可能存在空數組的情況,那么length = 0,不需要刪除任何項目。
而當只有一個數組的時候,length = 1,同樣不需要刪除任何項目。
看了下用時,800ms屬于中間位置。
看了下44ms的范例,采用的是下標標記,用了反向的思路。
因為是有序數組,采用了快慢兩種指針,當存在不一致的時候,可以進行覆蓋,達到刪除的目的。
第二題
80. 刪除排序數組中的重復項 II
難度:中等
類型:數組
給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素最多出現兩次,返回移除后數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組并在使用 O(1) 額外空間的條件下完成。
和第一題十分相似,但是多了條件,就是數值可以出現兩次,這就需要額外的進行計數。
class Solution:def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""if len(nums) < 1:return 0point = nums[0]count = 0 for i in nums[1:]:if point != i:point = icount = 0else:count = count + 1if count == 2:nums.remove(i)count = 1return len(nums)
我的思路都是比較粗暴的辦法,就是用變量記錄當前的對比值,當對比值出現超出2次時候,就進行remove,和第一題比較接近的思路,方法也大致相同。
這題的用時會更少一點,但是也是中間位置。
總結
這兩天做的題目都比較相似,而且難度較低,都是數組的題目。
套路比較相似,對python3的刪除操作和遍歷也有了更深的認識與實踐。
后續要開始做更多其他數據結構的題目,不斷嘗試。