leetcode算法刷题之-数组缺失/重复数字问题

136-只出现一次的数字

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

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

思路:

这一题我尝试了好几种方法,最开始想到的是暴力法。无非就是先用个set()函数去重,然后遍历set集合,看里面的元素在原nums集合里的个数是否为1,借助count()函数。结果是超出时间限制,代码如下:

class Solution(object):
    # 可用count(num)查找列表nums中单个元素num在列表nums中的个数情况
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        set_nums = set(nums)
        for num in set_nums:
            if nums.count(num) == 1:
                return num


if __name__ == "__main__":
    nums = [2, 3, 2]
    unique_num = Solution().singleNumber(nums)
    print(unique_num)

既然,set集合的遍历效率较低,当时我就想到了用遍历效率最快的dict字典来遍历了。果不其然有奇效,代码如下:

class Solution(object):
    # 可用count(num)查找列表nums中单个元素num在列表nums中的个数情况
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums_dict = {
   }
        for num in nums:
            nums_dict[num] = nums_dict.get(num, 0) + 1

        for key, val in nums_dict.items():
            if val == 1:
                return key



if __name__ == "__main__":
    nums = [2, 3, 2]
    unique_num = Solution().singleNumber(nums)
    print(unique_num)

方法三:

思路是:通过这些不重复的元素和的两倍减去原来nums的和,得到的结果就是单个元素。是不是脑洞大开?哈哈哈哈哈哈

代码如下:

class Solution(object):
    # 通过这些不重复的元素和的两倍减去原来nums的和,得到的结果就是单个元素
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        set_nums = set(nums)
        return 2*sum(set_nums)-sum(nums)


if __name__ == "__main__":
    nums = [2, 3, 2]
    unique_num = Solution().singleNumber(nums)
    print(unique_num)
 

方法四:

思路:可用异或运算快速找到只出现依次的数字。 两个相同的数字做异或运算结果为0;0与非0数字做异或运算结果为非零运算。

代码如下:

class Solution(object):
    # 可用异或运算快速找到只出现依次的数字
    # 两个相同的数字做异或运算结果为0;0与非0数字做异或运算结果为非零运算
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        singel_num = 0
        for num in nums:
            singel_num ^= num
        return singel_num


if __name__ == "__main__":
    nums = [2, 3, 2]
    unique_num = Solution().singleNumber(nums)
    print(unique_num)

137-只出现一次的数字 II

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

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

输入: [0,1,0,1,0,1,99] 输出: 99 思路:

思路就是:通过这些不重复的元素和的三倍减去原来nums的和,得到的结果就是单个元素的两倍。

代码如下:

class Solution(object):
    # 通过这些不重复的元素和的三倍减去原来nums的和,得到的结果就是单个元素的两倍
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        set_nums = set(nums)
        return (3*sum(set_nums)-sum(nums))//2

if __name__ == "__main__":
    nums = [2, 3, 2]
    unique_num = Solution().singleNumber(nums)
    print(unique_num)

217.是否存在重复元素

“”" 给定一个整数数组,判断是否存在重复元素。

如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

示例 1:

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

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

输入: [1,1,1,3,3,4,3,2,4,2] 输出: true “”"

class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        #1.go over each element in the array
        #find if any value matches
        # creat a dictionary
        # if new element in dictionary, return true
        #if not, return false

        #2.sort array, i.e. after sorted[1, 1, 2, 3]
        # if nums[i] = ? nums[i + 1], return true if  ==
        # return false if !=
        nums.sort()
        for i in range(len(nums) - 1):
            if nums[i] == nums[i + 1]:
                return True
        return False

217.是否存在重复元素2(移动k位)

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i
和 j 的差的 绝对值 至多为 k。

示例 1:

输入: nums = [1,2,3,1], k = 3 1和1的INDEX之差没超过K 输出: true 示例 2:

输入: nums = [1,0,1,1], k = 1 输出: true 示例 3:

输入: nums = [1,2,3,1,2,3], k = 2 输出: false

#建立DICTIONARY方便查找

class Solution(object):
    def containsNearbyDuplicate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        lookup = {
   }
        for i, num in enumerate(nums):
            if num not in lookup:
                lookup[num] = i
            else:
                if i - lookup[num] <= k:
                    return True
            lookup[num] = i
        return False

229. 求众数2

给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

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

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

设c为众数以外的数的总和,a, b为超过1/3的众数的频数,有三种情况: (1)a,b均超过1/3; (2)a,b中有

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值