题目1 排序数组 leetcode912
描述:给定一个整数数组 nums
。
要求:将该数组升序排列。
当然可以直接调用sorted函数,如下,非常方便。
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
return sorted(nums)
也可以自己手写一下快速排序,锻炼一下自己 ,这题光靠快速排序还不行,测试点中有全是正确升序的满额列表,需要加入随机因素,这样分割起来才快一些
def partition(A, p, r):
x = A[r]
i = p-1
for j in range(p,r):
if A[j] < x:
i = i + 1
A[i],A[j] = A[j],A[i]
A[i+1],A[r] = A[r],A[i+1]
return i+1
# 加入随机的元素,要不然在原序列都是正确顺序的情况下,时间复杂度是O(n^2)级别的
def randomized_partition(A, p, r):
i = random.randint(0, 100000)%(r - p + 1) + p # 随机选择p右边的一个元素作为主元
A[i],A[r] = A[r],A[i]
return partition(A, p, r)
def quicksort(A, p, r):
if p<r:
q = randomized_partition(A, p, r)
quicksort(A, p, q-1)
quicksort(A, q+1, r)
class Solution:
def sortArray(self, nums: List[int]) -> List[int]:
quicksort(nums,0,len(nums)-1)
return nums
题目2 合并两个有序数组 leetcode88
描述:给定两个有序数组 nums1
、nums2
。
要求:将 nums2
合并到 nums1
中,使 nums1
成为一个有序数组。
O(n*(n+m))复杂度
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# 在nums1中进行遍历,找到nums1[i]>x,nums1[i-1]<=x,就可以将x插入i上
# 如果i位于边界上,则可以直接插入
left = 0
right = m-1
if m == 0:
for i in range(n):
nums1[i]=nums2[i]
return
for i in range(n):
for j in range(n+m):
if j == left and nums2[i]<=nums1[j]:
nums1.insert(j,nums2[i])
break
if nums1[j]>nums2[i] and nums1[j-1]<=nums2[i]:
nums1.insert(j,nums2[i])
break
if j == right and nums2[i]>=nums1[j]:
nums1.insert(j+1,nums2[i])
break
right+=1
for i in range(n):
nums1.pop()
O(n+m)复杂度
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# 在nums1中进行遍历,找到nums1[i]>x,nums1[i-1]<=x,就可以将x插入i上
# 如果i位于边界上,则可以直接插入
left = 0
right = m-1
point1 = 0
point2 = 0
if m == 0:
for i in range(n):
nums1[i]=nums2[i]
return
while right<n+m-1:
if point1 == left and nums2[point2]<=nums1[point1]:
nums1.insert(point1,nums2[point2])
point2+=1
right+=1
elif nums1[point1]>=nums2[point2] and nums1[point1-1]<=nums2[point2]:
nums1.insert(point1,nums2[point2])
point2+=1
right+=1
elif point1 == right and nums1[point1]<nums2[point2]:
nums1.insert(point1+1,nums2[point2])
point2+=1
right+=1
point1+=1
for i in range(n):
nums1.pop()
题目3 多数元素 leetcode169
描述:给定一个大小为n的数组 nums
。
要求:返回其中相同元素个数最多的元素。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
# 将列表转化为集合,再设一个字典,将集合元素作为字典的键,再遍历字典
# 直接数数
dic = {}
n = len(nums)
for x in set(nums):
dic[x] = 0
for x in nums:
dic[x]+=1
for x in dic.keys():
if dic[x]>n//2:
return x
今日加练:易混淆数 leetcode1056
描述:给定一个数字 N
,当它满足以下条件的时候返回 true
:
原数字旋转 180° 以后可以得到新的数字。
如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 。
2, 3, 4, 5, 7 旋转 180° 后,得到的不是数字。
易混淆数 (confusing number) 在旋转180°以后,可以得到和原来不同的数,且新数字的每一位都是有效的。
class Solution:
def confusingNumber(self, n: int) -> bool:
# 易混淆数 (confusing number) 在旋转180°以后
# 可以得到和原来不同的数 -> 全为1或者全为8则不行 9和6的位置中心对称也不行
# 且新数字的每一位都是有效的 -> 原数中只能含有0,1,5,6,8,9
num = n
nums = []
while num:
nums.append(num%10)
num//=10
for x in nums:
if x==2 or x==3 or x==4 or x==5 or x==7:
return False
# 打个表 把各个数旋转后会变成的数打出来
dic={0:0,1:1,6:9,8:8,9:6}
s = 0
for x in nums:
s*=10
s+=dic[x]
if s==n:
return False
return True