Leetcode 26.删除排序数组中的重复项 By Python
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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
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的数
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
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
旋转数组需要有几种方法,暂时只会一种,待完善
网友评论