[刷题] LeetCode刷题-Array-Python (1)

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 等于处理后列表长度。

结果:
27.Remove Element

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)

思路:
首先,所给数组是经过排序的,这一点是可以利用到的。
可以利用位置变量,对数组进行遍历,与位置变量所对应的值相同将会被删去。
结果:
26.Remove Duplicates from Sorted Array

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]

结果:
80.Remove Duplicates from Sorted Array II

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)
结果:
189.Rotate Array
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.

结果:
41.  First Missing Positive

如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!

作者信息:
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink

你可能感兴趣的:(LeetCode,LeetCode,刷题日记)