【Python】LeetCode算法_数组

442. 数组中重复的数据 -中

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。

找到所有出现两次的元素。

示例:

输入:
[4,3,2,7,8,2,3,1]

输出:
[2,3]

方法一:collections模块的Counter类

class Solution:
    def findDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        from collections import Counter
        l = []
        dic = Counter(nums)
        for key, value in dic.items():
        	if value == 2:
        		l.append(key)
        return l

方法二:set

class Solution:
    def findDuplicates(self, nums):
    	l = []
    	s = set()
    	for i in nums:
    		if i in s:
    			l.append(i)
    		else:
    			s.add(i)
    	return l

延伸:collections.Counter类

  • Counter 是一个有助于 hashable 对象计数的 dict 子类。元素-计数分别存储为字典的键和值,计数可以为任意整数,包括零和负数。
from collections import Counter
l = 'abcdab'
d = Counter(l)		→ d = Counter({'a': 2, 'b': 2, 'c': 1, 'd': 1})

287. 寻找重复数 -中

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

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

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

说明:

  1. 不能更改原数组(假设数组是只读的)。
  2. 只能使用额外的 O(1) 的空间。
  3. 时间复杂度小于 O(n2) 。
  4. 数组中只有一个重复的数字,但它可能不止重复出现一次。
方法一:

class Solution:
    def findDuplicate(self, nums):
        for i in range(len(nums)):
            while nums[i] != i:
                j = nums[i]
                if j == nums[j]:
                    return j
                else:
                    nums[i], nums[j] = nums[j], j
                
方法二:(借鉴)

class Solution:
    def findDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        slow = nums[0]
        fast = nums[slow]
        
        while fast != slow:
            slow = nums[slow]
            fast = nums[nums[fast]]
        
        fast = 0
        
        while fast != slow:
            slow = nums[slow]
            fast = nums[fast]
        
        return fast

448. 找到所有数组中消失的数字

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

示例:

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]

class Solution:
    def findDisappearedNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        s = set(nums)
        l = [i for i in range(1,len(nums)+1) if i not in s]
        return l

136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:

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

示例 2:

输入: [4,1,2,1,2]
输出: 4

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = 0
        for i in nums:
            n ^= i
        return n

说明: ^= 为异或运算,近似于加法,只是在两边有相同数时会抵减掉。

  • 异或:也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

异或讲解参考:http://lijinma.com/blog/2014/05/29/amazing-xor/

905. 按奇偶排序数组

给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。

你可以返回满足此条件的任何数组作为答案。

示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。

提示:
1 <= A.length <= 5000
0 <= A[i] <= 5000

class Solution(object):
    def sortArrayByParity(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        i, j = 0, len(A) - 1
        while i < j:
            if A[i] % 2 > A[j] % 2:
                A[i], A[j] = A[j], A[i]
            if A[i] % 2 == 0: i += 1
            if A[j] % 2 == 1: j -= 1
        return A

961. 重复 N 次的元素

在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。

返回重复了 N 次的那个元素。

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

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

示例 3:
输入:[5,1,5,2,5,3,5,4]
输出:5

提示:

  1. 4 <= A.length <= 10000
  2. 0 <= A[i] < 10000
  3. A.length 为偶数
class Solution:
    def repeatedNTimes(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        l = []
        
        for i in A:
            if i not in l:
                l.append(i)
            else:
                return i

猜你喜欢

转载自blog.csdn.net/Treasure99/article/details/85080562
今日推荐