数组缺失/重复数字
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中有