目录
剑指Offer11.旋转数组的最小数字
裂开,这题的二分怎么这么烦。。。比小的那边好像就不对的样子???
剑指Offer19.正则表达式匹配
- 动态规划
这次好一些,理解的更清楚了,需要判断转移条件,另外 d p [ 0 ] [ 0 ] = T r u e dp[0][0]=True dp[0][0]=True
剑指Offer20.表示数值的字符串
确定有限状态自动机
这玩意儿我真吐了。。自动机肯定能写,但是确定状态和转移状态是真恶心。。。这题背一下就好吧可能。。
剑指Offer36.二叉搜索树与双向链表
得。。。又不会了,都快出现生理抗拒了 = =
剑指Offer41.数据流中的中位数
一个大根堆一个小根堆√
这个吧。。堆的代码用法得记一下,不太熟练,会忘 = =
剑指Offer43.1~n整数中1出现的次数
依旧不会,还不想看
剑指offer51.数组中的逆序对
归并排序
这个题太绕了,得先把归并排序搞清楚!
- 给两部分分别排序,计算出各自的逆序对数
- 合并两部分,算出总的逆序对数
注意看代码中的注释,思想很妙
class Solution:
def mergeSort(self, nums, tmp, l, r):
if l >= r:
return 0
mid = (l + r) // 2
count = self.mergeSort(nums, tmp, l, mid) + self.mergeSort(nums, tmp, mid+1, r)
a = l
b = mid + 1
pos = l
while a <= mid and b <= r:
if nums[a] <= nums[b]:
tmp[pos] = nums[a]
a += 1
count += (b-mid-1)
# 最最精彩的地方!!!如果nums[a] > nums[b],那么nums[b]就会被放到tmp里,但还不知道下一个,也就是nums[b+1]跟nums[a]比谁大谁小,而当找到了nums[a]<nums[b]的时候,说明这之前的nums[b-i]都是小于nums[a]的了。
else:
tmp[pos] = nums[b]
b += 1
pos += 1
# 往下两个循环是为了解决剩余的部分长度,两个循环只会有一个被执行
for k in range(a, mid+1):
tmp[pos] = nums[k]
count += (b-mid-1)
pos += 1
for k in range(b, r+1):
tmp[pos] = nums[k]
pos += 1
# 给tmp是排序后的序列,要给nums赋值
nums[l:r+1] = tmp[l:r+1]
return count
def reversePairs(self, nums: List[int]) -> int:
tmp = [0] * len(nums)
return self.mergeSort(nums, tmp, 0, len(nums)-1)
剑指Offer53-I.在排序数组中查找数字I
好像有点开窍,又好像没有。。
剑指Offer56-I.数组中数字出现的次数
剑指Offer56-II.数组中数字出现的次数II
这俩题都有 位运算 的解法,需要关注一下,之前不太会用位运算。
剑指Offer59-I.滑动窗口的最大值
单调队列 还需要加深理解,得记住是个什么流程,比new_target小的队列中的元素都要出队
剑指Offer59-II.队列的最大值
这题也是单调队列方法,跟上面那个一起巩固一下。
剑指Offer65.不用加减乘除做加法
我裂了,位运算加减法,python自身性质还不一样。。。。。。
[追更] 补了一下知识,目前感觉还行,再来一遍可能就好了
[追更 2] 不行,又忘了。