NO.1给定一个非空数组,除了其中的某个元素只出现了一次之外,其余每个元素均出现两次,找出那个只出现了一次的元素。
说明:你的算法应该具有时间线性复杂度。
示例:
输入:[2,2,1]
输出:1
输入:[4,1,2,1,2]
输出:4
题目说完了,大部分人可以想到的正常解题思路:
class Solution:
def sing_num(self, nums):
table = {}
for i in nums:
try:
table.pop(i)
except:
table[i] = 1
return table.popitem()[0]
能想出来这种方法本人感觉已经很厉害了,在O(n)复杂度内就解决了,可还有一种方法,复杂度也是一样的
class Solution:
def sing_num(self, nums):
a = 0
for i in nums:
a ^= i
return a
看完从“一脸懵逼”再到“有所领悟”再到“豁然开朗”,这种思路的人,真的厉害。
NO.2给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
我看完题后脑中出现的思路:
class Solution:
def majorityElement(self, nums):
nums_set=set(nums)
most_count=0
most_num=0
for i in nums_set:
if nums.count(i)>most_count:
most_count=nums.count(i)
most_num=i
return most_num
另类的思路:
class Solution:
def majorityElement(self, nums):
nums=sorted(nums)
return nums[int(len(nums)/2)]
仔细看看题目的描述,这个思路简直了,虽然并没有用到什么算法,但算是让人眼前一亮吧。