27.Remove Element
代码:
class Solution:
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
index = 0
for x in nums:
if x!=val:
nums[index] = x
index+=1
return index
思路:
利用位置变量index,遍历整个列表,当所遍历元素元素不为 val 时,index 所对应的元素赋值为所遍历元素,并令 index+=1。最后,index 等于处理后列表长度。
结果:
26.Remove Duplicates from Sorted Array
代码:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
j = 0
for i in range(len(nums)):
if nums[i]!=nums[j]:
j+=1
nums[j] = nums[i]
return j+1
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
j = 0
i = 1
while i<len(nums):
if nums[j] == nums[i]:
i +=1
else:
j+=1
nums[j] = nums[i]
del nums[j+1:]
return len(nums)
思路:
首先,所给数组是经过排序的,这一点是可以利用到的。
可以利用位置变量,对数组进行遍历,与位置变量所对应的值相同将会被删去。
结果:
80.Remove Duplicates from Sorted Array II
代码:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
pos = -1
for x in nums:
if pos < 1 or nums[pos-1] < x:
pos+=1
nums[pos] = x
return pos+1
思路:
首先,所给数组依然是经过排序的,且仅删除重复两次以上的元素。
假设 pos1 与 pos2 为已处理部分最后的两个元素,那么元素x不被删除,应符合条件:
nums[pos1]!=nums[x] or nums[pos2]!=nums[x]
注意,结合所给条件,这个条件等价于:
nums[pos1] < nums[x]
结果:
277.Find the Celebrity(需要会员)
代码: 无
思路: 无
结果: 无
189.Rotate Array
代码:
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: void Do not return anything, modify nums in-place instead.
"""
k %= len(nums)
nums[:] = nums[-k:] + nums[:-k]
思路:
这道题属于简单题,但是有个细节需要注意:
nums[:] = nums[-k:] + nums[:-k]
nums = nums[-k:] + nums[:-k]
这两种写法是有区别的,前者会对改变 old nums,而后者将改变 new nums,意味着后者写法将得不到所期望的结果。
(关于这一点,请看:pass)
结果:
41.First Missing Positive
代码:
class Solution:
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(1,len(nums)+2):
if not i in nums:
return i
class Solution:
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 1
i = 1
while i in nums:
i += 1
return i
class Solution:
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 1
nums.append(0)
N = len(nums)
for i in range(N):
if nums[i] < 0 or nums[i] >= N:
nums[i] = 0
for i in range(N):
nums[nums[i]%N] += N
for i in range(N):
if nums[i]//N==0:
return i
return N
思路:
这道题属于难题,原因在于虽然解决办法容易想出来,但是真正O(n)的算法比较难想。
让我们来一起看看第三种解法,这参考了 LeetCode 上的相关讨论:
如果一个数组的长度为 n ,那么 firstMissingPositive 的讨论范围应该为 [1,n+1]。
首先,我们向数组中加入元素0,使得数组下标的范围扩展为 [0,n]
接着,我们一共做三次循环:
第一次循环:将所有小于0或者大于等于n+1的元素赋值为0。
第二次循环:遍历数组,将元素出现次数存储在相对应的index处,相当于做Hash处理。
第三次循环:遍历数组,找到出现次数为0的元素,若找不到,即返回n+1.
结果:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink