题目链接
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
3347 执行操作后元素的最高频率 II ## 解题思路
超时方案:暴力枚举+二分查找
枚举所有可能的n,再通过二分查找n的数量、n-k至n+k的范围,结合操作上限得出,在3346
执行操作后元素的最高频率 I中能通过,但在此题中能超时
123456789101112131415161718192021222324252627282930313233343536373839404142434445func findLeftIndex(nums []int, n int) int { var l, r = 0, len(nums) - 1 if nums[0] >= n { return -1 } for l < r { m := (l + r + 1) / 2 if nums[m] >= n { r = m - 1 } else { l = m } } return l}func findRightIndex(nums []int, n int) int { var l, r = 0, len( ...
题目链接
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
3171
参考链接
灵茶山艾府
- leetcode 3171题解
解题思路
主要目的就是算出所有子数组的按位运算值并算出与k的绝对差,暴力解法时间复杂度为且题目中nums.length最大值为肯定会超时
为了更好理解,设一对指针l/r和一个数组dp[],dp[l]表示nums[r]|nums[r-1]|nums[r-2]...nums[l]的值,即子数组r至l的按位与运算值(当r后移时dp[0]至dp[r]中的值会被覆盖)
LogTrick的思路就是利用当a|b=b时a|b|c|d|e == b|c|d|e的特点省去大量的重复计算(最终时间复杂度能达到),即当(nums[r]|dp[l]) == dp[l]就可以直接跳过dp[l-1]到dp[0]的计算,因为此时dp[l],dp[l-1],dp[l-2]…dp[0]与上一个r边界的值完全相同
123456789var dp = make([]int, len(nums))var ret = abs(nums[0]-k)for r := range nums { //当(nums[r]|dp[l])== ...
题目链接
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/react-query@5.90.2 ## 介绍
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 ...
前置知识
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 1986][状压DP]完成任务的最少工作时间段](https://s3.inkorcloud.top/image/2025/10/28d7647b34cdb1157f610f91962d82d5.png)
![[leetcode 2197][Go][栈][模拟]替换数组中的非质数](https://s3.inkorcloud.top/image/2025/10/807921ea51f64ad42220a3dd408dfcfe.png)
![[leetcode 3563][Go][动态规划]区间DP和线性DP的混合使用](https://s3.inkorcloud.top/image/2025/10/155967c8f2c77f87804270970c10af46.png)
![[leetcode 3347][Go][答案二分]万能的二分法](https://s3.inkorcloud.top/image/2025/10/b92574e48ab8dfff1b32cc049a61df5f.png)
![[leetcode 3605][Go][二分答案]能二分的不只有数组](https://s3.inkorcloud.top/image/2025/10/3314adab4c88e645ac3a6dae75ab73e0.png)
![[leetcode 3171][备忘录][Go]关于LogTrick解法的个人理解](https://s3.inkorcloud.top/image/2025/10/3396d17ba0c1696cb78fb6e93d7d1d0b.png)
![[leetcode 907][Java]子数组的最小值之和](https://s3.inkorcloud.top/image/2025/10/4ffa32dd8b74fdf9f115a65959cb64e1.png)

