题目链接
leetcode 837
新21点
解题思路
该题目的就是求当爱丽丝到达k点后的所有可能中点数在[k,n]的概率
DP(超时)
设dp[i]表示从开始到点数i的概率,初始值dp[0] = 1,例如maxPts = 10, k =
5,那么dp[1] = 0.1, dp[2] = 0.11, dp[3] = 0.121
算出dp[1]到dp[k+maxPts-1](最高只能到达k+maxPts-1)后,结果就等于
123456789101112131415161718func new21Game(n int, k int, maxPts int) float64 { var dp = make([]float64, k+maxPts) dp[0] = 1 for i := range k { for j := 1; j <= maxPts; j++ { dp[i+j] += dp[i] / float64(maxPts) } } sum1 := float64(0) sum2 := float64(0) for i := k; i < k+maxPts; ...
题目链接
leetcode
2318 不同骰子序列的数目
解题思路
深度搜索遍历(超时)
建立一个数组记录第i位及以前的数字,遍历所有符合要求的数字
12345678910111213141516171819202122232425262728const MOD = int64(1e9 + 7)func gcd(a int, b int) int { n, m := max(a, b), min(a, b) if m == 0 { return n } return gcd(m, n%m)}func distinctSequences(n int) int { var dfs func(n int) int64 var dp = make([]int, n) dfs = func(i int) int64 { if i == n { return 1 } sum := int64(0) for m := 1; m <= 6; m++ { if (i < 2 || dp[i-2] != m) && (i < 1 || dp[i-1] ! ...
题目链接
leetcode
1986 完成任务的最少工作时间段
解题思路
首先声明一个数组sum并做预处理,sum[i]表示当前i对应二进制位为1的任务需要消耗的时间和,例如sum[0B1101]表示完成第1、3、4个任务总共需要的时间
123456for i := 1; i < len(tasks); i++ { m := 1 << i for j := range m { sum[m|j] = sum[j] + tasks[i] }}
处理好后再声明一个dp,dp[i]表示完成当前i对应二进制位为1的任务最小需要的时间段数量,例如dp[0B1001]表示完成第一个和第四个任务需要的最小时间段数量。对于每个dp[i],可以枚举i的所有非空子集以表示最后一个时间段完成的工作,例如对于dp[0B1011]就可以枚举0B1011,0B0011,0B1001,0B1010,0B1000,0B0010,0B0001。若当前子集的时间和不超过sessionTime就可以尝试将其作为最后一个时间段,所以dp[i]=min(dp[i^1]+1, dp ...
题目链接
leetcode
2197 替换数组中的非质数
解题思路
拼接数组-超时
拼接数组导致每次有非质数都会将后半部分的元素遍历一遍,时间复杂度为
123456789101112131415161718192021func gcd(a int, b int) int { n, m := max(a, b), min(a, b) if m == 0 { return n } return gcd(m, n%m)}func replaceNonCoprimes(nums []int) []int { for i := 0; i < len(nums); i++ { if i > 0 { g := gcd(max(nums[i], nums[i-1]), min(nums[i], nums[i-1])) if g > 1 { nums[i] = (nums[i] * nums[i-1]) / g nums = append(nums[:i-1], nums[i:]...) i -= 2 } } } return nums}
数组偏移量 ...
题目链接
leetcode
3563 移除相邻字符后字典序最小的字符串
解题思路
暴力解法-深度遍历(超时)
遍历出字符串每种变化的可能并选出字典序最小的字符串,时间复杂度为
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051func compare(a *string, b *string) int { var i, j = 0, 0 for i < len(*a) && j < len(*b) { if (*a)[i] != (*b)[j] { return int((*a)[i]) - int((*b)[i]) } i++ j++ } if j >= len(*b) && i >= len(*a) { return 0 } else if j >= len(*b) { return 1 } else { return -1 }}func abs(x int) int ...
题目链接
leetcode
3605 数组的最小稳定性因子
解题思路
这道题说难不难,只是追求通过所有实例的话只要根据题目中最小化最大值想到二分答案就能做到的时间复杂度
单次计算
这里声明一个子函数func sub(nums []int, maxC int, length int) bool用于计算maxC次操作内能否使最长稳定子数组的长度小于等于length
123456789101112131415161718192021222324252627282930313233343536373839func gcd(a int, b int) int { if b == 0 { return a } return gcd(b, a%b)}func sub(nums []int, maxC int, length int) bool { var leng = len(nums) var arr = slices.Clone(nums) var g = 1 //l和r用于表示以r结尾的最长稳定子数组 //l,r为左开右闭区间,根据个人喜好决定 for l, r := -1, 0 ...
题目链接
leetcode
- 907
前置概念
单调栈
栈中元素始终保持某种单调性,即从栈底到栈顶使用递增/递减,比如:
将[1, 4, 3, 9, 5]压入单调递增栈
压入1,stack:[1]
压入4, stack:[4, 1]
若直接压入3则无法保持单调性,此时需要不断弹出栈顶直到能够保持单调性,这里应该弹出4,压入3,stack:[3,
1]
压入9,stack:[9, 3, 1]
同样,若直接压入5则无法保持单调性,需要弹出9再压入,stack:[5, 3,
1]
通过压入单调栈的过程就可以得知数组中的元素A前/后第一个大于/小于A的元素,例如上述示例中,在弹出4时就可以知道元素4往后第一个小于4元素时3,在弹出9时就可以知道第一个小于9的是5
题目解析
需要计算每个子数组最小值的和,那么就可以从获取每个元素作为最小值所在的子数组,再将所有子数组的数量乘对应最小值相加即可得到答案
### 辐射范围 #### 定义
这里临时定义一个辐射范围,即元素X辐射范围内所有含X的子数组最小值都是X
#### 确定辐射范围
显然要满足辐射范围的唯一条件就是该范围内没有比X更小的元素, ...
注意:本文章基于@tanstack/[email protected] ## 介绍
tanstack query (原react
query)是一个异步状态库,核心功能是从服务器获取、缓存、同步与更新状态从而摆脱手动发送网络请求。
tanstack
query通过QueryClient管理缓存,并在合适的时候重新获取/刷新/回收缓存,缓存在QueryClient中以键值对的方式存在(键的类型为(string|number|undefined)[])
快速入门
安装
12npm i @tanstack/react-querynpm i @tanstack/react-query-devtools --save-dev
启用tanstack query
创建一个QueryClient对象并使用QueryClientProvider导入 1234567891011121314151617181920212223const queryClient = new QueryClient( { defaultOptions: { queries: { ...
注意:本文章基于zustand v5.0.7 ## 介绍
Zustand是一个轻量便捷的全局状态管理库,可在短时间内快速上手
对比
维度
Redux
MobX
Zustand
样板代码
多(action、reducer、selector)
少(装饰器 / makeAutoObservable)
极少(create(set => …) 即可)
异步
需中间件(thunk/saga)
原生 runInAction / flow
原生 async/await
绑定组件
react-redux connect/useSelector
observer 高阶组件
直接 useStore 钩子
快速上手
安装
123npm i zustand# npm i immer persist# 可能需要用到的中间件依赖
创建状态
1234567891011121314151617181920interface UserStore { id: number age: number arr: number[] setId: (id: num ...
Android
未读前置知识
repo
一个易于git的python脚本,可以同时管理多个git项目,批量执行git操作
开始构建
同步源代码
先创建一个空文件夹并进入再用repo初始化仓库
1repo init -u https://android.googlesource.com/kernel/manifest 初始化后在通用内核镜像发布构建中找到需要构建的内核版本,在所需版本的内核工件中下载manifest_xxxxx.xml并移动到.repo/manifests/manifests.xml
注意:对于已废弃的构建版本需要将uptream和dest-branch改为正确的分支
例如: 123456789101112131415<?xml version='1.0' encoding='UTF-8'?><manifest> <remote name="aosp" fetch="https://android.googlesource.com/" review="https://android.googlesource.com/" /> <default u ...

![[leetcode 837][概率][滑动窗口][DP]新21点](https://s3.inkorcloud.top/2026/03/642046f62a897436b6950be6bbe943c8.jpeg)
![[leetcode 2318][三维DP][二维DP]不同骰子序列的数目](https://s3.inkorcloud.top/2026/03/eebc0c38c8eff0f399086a3388c4a1b4.png)
![[leetcode 1986][状压DP]完成任务的最少工作时间段](https://s3.inkorcloud.top/2026/03/371d30158c2a0cf7fd3094f79175fa7b.jpeg)
![[leetcode 2197][Go][栈][模拟]替换数组中的非质数](https://s3.inkorcloud.top/2026/03/0f273e69a0aa5935c87aca1eae62d0d6.png)
![[leetcode 3563][Go][动态规划]区间DP和线性DP的混合使用](https://s3.inkorcloud.top/image/2025/10/155967c8f2c77f87804270970c10af46.png)
![[leetcode 3605][Go][二分答案]能二分的不只有数组](https://s3.inkorcloud.top/image/2025/10/3314adab4c88e645ac3a6dae75ab73e0.png)
![[leetcode 907][Java]子数组的最小值之和](https://s3.inkorcloud.top/2026/03/e023d2fc57e035a3088ebe1e6f79e608.jpeg)

