美文网首页
LeetCode 数组题目 by python

LeetCode 数组题目 by python

作者: lililililiyan | 来源:发表于2019-05-25 12:08 被阅读0次

Leetcode 26.删除排序数组中的重复项 By Python

\color{red}{错了好几次的题目~~写的时候不懂返回数值是整数,但输出的答案是数组 }
\color{blue}{*好多天没有写题目了 o(╯□╰)o*}

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

思路

设立2个指针i,j。跑得快的指针j会在遇到不是重复的元素的时候停下来,此时i+1进行赋值。如此遍历即可。

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        slow = 0
        fast = 0
        while fast<n-1:
            if nums[fast] == nums[fast+1]:
                fast +=1
            else:
                slow += 1
                fast += 1
                nums[slow] = nums[fast]
        return slow+1

\color{purple}{------------------------------------------------------------------------------------------------------------------------}
\color{red}{求众数的方法MAP法和摩尔投票法}

169. 求众数

给定一个大小为 n的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3

示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

229. 求众数 II

给定一个大小为 *n *的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明:要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]</pre>
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]

1.map记录出现次数,遍历map找到次数大于n/2的值
2.消消乐(摩尔投票法):从第一个元素开始,记录一个值n,初始值为1,和当前数值curNum,如果遍历过程中的当前数值和curNum相同则n=n+1,如果不相同则n=n-1,当n为0时将curNum设置为当前数值,同时将n设置为1,遍历完数组之后当前的curNum就是所找的数
摩尔投票法只能用于查找出具有k个元素的数组中大于1/k的数

\color{red}{题169}
HashMAP

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        d = {}
        for i in range(n):
            if nums[i] in d:
                d[nums[i]] += 1 
            else:
                d[nums[i]] = 1
        for key in d:
            if d[key] > n//2:
                return key
            else:
                continue

摩尔投票法

class Solution:
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        cnt, ret = 0, 0
        for num in nums:
            if cnt == 0:
                ret = num
            if num != ret:
                cnt -= 1
            else:
                cnt += 1
        return ret

\color{red}{题229}
HashMAP

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        dict = {}
        ret = []
        for num in nums:
            if num in dict:
                dict[num]+=1
            else:
                dict[num]=1
        for k in dict:
            if dict[k]>len(nums)/3:
                ret.append(k)
        return ret

摩尔投票法

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        ##摩尔投票法找出出现次数最大的两个数并判断它们的次数是否大于1/3
        ##不像找次数大于1/2的并不需要判断
        """
        ret1,ret2,cnt1,cnt2=0,0,0,0
        ret = []
        for num in nums:
            if (cnt1==0 or num==ret1) and num!=ret2:
                ret1=num
                cnt1+=1
            elif cnt2==0 or num==ret2:
                ret2=num
                cnt2+=1
            else:
                cnt1-=1
                cnt2-=1
        cnt1=0
        cnt2=0
        for num in nums:
            if num==ret1:
                cnt1+=1
            elif num==ret2:
                cnt2+=1
        if cnt1>len(nums)/3:
            ret.append(ret1)
        if cnt2>len(nums)/3:
            ret.append(ret2)
        return ret

旋转数组需要有几种方法,暂时只会一种,待完善

相关文章

网友评论

      本文标题:LeetCode 数组题目 by python

      本文链接:https://www.haomeiwen.com/subject/nomazqtx.html