2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0、n-1位置不需要达标,它们分别是最左、最右的位置, 中间位置i需要达标,达标的条件是 : arri-1 > arri...你每一步可以进行如下操作:对任何位置的数让其-1, 你的目的是让arr1~n-2都达标,这时arr称之为yeah!数组。 返回至少要多少步可以让arr变成yeah!数组。...数据规模 : 数组长度 数组中的值<=500。 来自360面试。 答案2022-01-12: 方法一、动态规划。 方法二、贪心。 时间复杂度:O(N)。 空间复杂度:O(N)。...:= len(arr) nums := make([]int, n+2) nums[0] = math.MaxInt64 nums[n+1] = math.MaxInt64...([]int, n+2) pre = nums[n+1] for i := n; i >= 1; i-- { change = getMin(pre-1, nums[i]
思路:因为数组已经是有序的,因此我们可以直接从两个数组的末位开始比较,将大的一个直接放到第一个数组的末尾,此时必须要求a数组的空间大小能够同时填充a数组和b数组的有效元素,然后依次比较两个数组元素的大小即可...代码实现: #include void merge(int *a, int n, int *b, int m) { int i = n-1;//a数组的最后一个有效元素的下标...int j = m-1;//b数组的最后一个有效元素的下标 int index = n+m-1; //合并数组的最后一位的下标 while (index) { if (i && a[i]>a...[j]) a[index --] = a[i --]; else a[index --] = b[j --]; } } int main() { int a[] = {1,3,5,7,9,0,0,0,0,0..., 5, b, m); for_each(a, a+n, [](int x) {cout << x << " ";}); return 0; }
用go语言,有 n 种度量单位,编号为 0 到 n−1。 输入一个长度为 n−1 的二维数组 conversions,每一项表示一种单位与另一种单位之间的换算关系:某个源单位等于若干个目标单位。...请你求出一个长度为 n 的数组 baseUnitConversion,其中 baseUnitConversion[i] 表示 1 个类型 0 的单位等于多少个类型 i 的单位。...每个换算关系 [源单位, 目标单位, 换算因子] 可以理解为从“源单位”节点指向“目标单位”节点的一条有向边,边的权重就是“换算因子”。...• g[1] 包含一条边:指向单位 2,因子为 3。 • g[2] 是一个空列表。 2....• 结果数组 (ans):长度为 n,空间复杂度为 O(n)。 • DFS的递归调用栈:在最坏情况下(图退化成一条链),递归深度为 n,空间复杂度为 O(n)。
2021-08-21:给定一个数组arr,长度为N > 1,从中间切一刀,保证左部分和右部分都有数字,一共有N-1种切法,如此多的切法中,每一种都有:绝对值(左部分最大值 – 右部分最大值)。...福大大 答案2021-08-21: max-arr0和max-arrN-1取最大值。 时间复杂度:O(N)。 空间复杂度:O(1)。 代码用golang编写。...代码如下: package main import ( "fmt" "math" ) func main() { arr := []int{1, 2, 3} ret...len(arr); i++ { max = getMax(arr[i], max) } return max - getMin(arr[0], arr[len(arr)-1]
2021-07-27:给定一个数组arr,长度为N,arr中的值只有1,2,3三种。...1-6中→右。 单决策递归。 k层汉诺塔问题,是2的k次方-1步。 时间复杂度:O(N)。 空间复杂度:O(1)。 代码用golang编写。...true { ret := kth2(arr) fmt.Println("迭代:", ret) } } func kth(arr []int) int { N...:= len(arr) return step(arr, N-1, 1, 3, 2) } // 0...index这些圆盘,arr[0..index] index+1层塔 // 在哪?...p1 := (1 1 p2 := 1 p3 := step(arr, index-1, other, to, from) if p3
用go语言,给你一个长度为 n 的数组 nums,数组恰好包含 1 到 n 这 n 个整数(每个数出现一次)。...3 XOR 2 = 2 • (0, 1, 2) → 3 XOR 1 XOR 2 = 0 不同的 XOR 值为 {0, 1, 2, 3},因此输出为 4。...解决过程分析 1. 关键观察(脑筋急转弯) 这个问题的核心是一个数学洞察:对于给定的排列,所有可能的三元组异或结果的不同值数量只与数组长度 n 有关,而与数组中元素的具体排列顺序无关。 2....算法逻辑 • 当 n ≤ 2 时:直接返回 n。因为当数组元素很少时,所有可能的异或结果就是数组元素本身。...计算 1 为 4 3. 最终输出为 4,与题目示例一致 4.
2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] = a, 表示i号员工一开始得分是a, 给定一个长度为M的二维数组operations...答案2023-06-18: 具体步骤如下: 1.创建一个长度为N的一维数组scores,表示每个员工的初始得分。 2.创建一个长度为M的二维数组operations,表示操作序列。...4.初始化一个节点数组nodes,用于存储每个员工的节点信息。 5.初始化一个空的得分和桶的映射表scoreBucketMap。...空间复杂度分析: • 创建一个长度为N的数组scores,空间复杂度为O(N)。 • 创建一个长度为M的数组operations,空间复杂度为O(M)。...• 结果数组ans的长度为N,空间复杂度为O(N)。 • 总体空间复杂度为O(N + M)。
2023-05-11:给你一个 m x n 的二进制矩阵 grid,每个格子要么为 0 (空)要么为 1 (被占据),给你邮票的尺寸为 stampHeight x stampWidth。...3.遍历 grid 中的每一行,使用滚动数组的方式还原 cnt 和 pre 数组,并通过它们来计算每列中为 0 的位置的数量。...同时,如果某个位置 (i, j) 的值为 0 且它所在列中没有其他的 0,则返回 false;否则返回 true。时间复杂度为 O(mn),其中 m 和 n 分别表示矩阵 grid 的行数和列数。...空间复杂度为 O(mn),因为函数中创建了两个 m+1 行 n+1 列的二维数组 sum 和 diff,以及一个长度为 n+1 的一维数组 cnt 和 pre。...这些数组所占用的总空间为 (m+1)(n+1) + 2(n+1) = mn + 3m + 3n + 3,即 O(mn)。
2025-09-10:删除一个冲突对后最大子数组数目。用go语言,给你一个正整数 n,数组 nums 为按顺序的 1 到 n。...• 需要高效方法:通常这类问题可以通过预处理冲突关系,并利用双指针/滑动窗口来统计合法子段数(但这里需要枚举删除哪一对冲突)。 3....代码具体步骤 • 初始化 bMin1 和 bMin2 数组(长度 n+1,初始值设为很大)。...• 初始化数组:O(n)。 • 从后往前扫描:O(n)。 • 因此总时间复杂度为 O(n + m)。 • 额外空间复杂度:O(n)。...• 需要 bMin1、bMin2、delCount 数组,每个长度均为 n+1。 • 因此额外空间为 O(n)。
2022-03-18:arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益就是累加和 = 3 + 1 + 4 + 5...}) for _, magic := range magics { st.update0(magic[0]+1, magic[1]+1, magic[2], 1, n, 1) } ans :...return ans } // 为方法三特别定制的线段树 // 区间上维持最大值的线段树 // 支持区间值更新 // 为本道题定制了一个方法: // 假设全是单点查询,请统一返回所有单点的结果(一个结果数组...:= size + 1 ans.max = make([]int, N<<2) ans.change = make([]int, N<<2) ans.update = make([]bool, N...(n int) []int { ans := make([]int, n+1) this.process(ans, 1, n, 1) return ans } func (this *SegmentTree3
2022-12-22:给定一个数字n,代表数组的长度,给定一个数字m,代表数组每个位置都可以在1~m之间选择数字,所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。返回达标数组的数量。...("功能测试开始"); for n in 4..=8 { for m in 1..=5 { let ans1 = number1(n, m);...(n as usize).collect(); return process1(0, n, m, &mut a);}fn process1(i: i32, n: i32, m: i32, path...// n : 一共的长度!// m : 每一位,都可以在1~m中随意选择数字// 返回值:i..... 有几个合法的数组!...// 尤其是理解ends数组的意义!fn number2(n: i32, m: i32) -> i32 { //repeat(vec!
2025-11-23:数组元素相等转换。用go语言,给出一个长度为 n 的数组 nums,元素仅为 1 或 -1,和一个非负整数 k。...nums[i] 的值为 -1 或 1。 1 n。 输入: nums = [1,-1,1,-1,1], k = 3。 输出: true。...这个过程模拟了操作对数组元素符号的累积影响。 • 在遍历过程中,算法维护两个关键状态: • left:剩余的可执行操作次数,初始值为 k。...每次遍历的时间复杂度是 O(n),其中 n 是数组 nums 的长度。因此,总的时间复杂度是 O(n)。...• 总的额外空间复杂度:算法只使用了固定数量的额外变量(如 left, mul, 循环变量 i 等),这些空间开销不随输入数组的大小 n 而变化。因此,总的额外空间复杂度是 O(1)。
2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组matrix, matrix[j] = {a,...返回一个长度为n的数组ans,表示每个任务完成的时间。 输入可以保证没有循环依赖。 来自美团。3.26笔试。 答案2022-06-25: 拓扑排序基础上做动态规划。 代码用rust编写。...[0,1],vec![0,2],vec![1,2],vec![3,1],vec!...[1] as usize].push(line[0]); in0[line[0] as usize] += 1; } let mut zero_in_queue: Vec...[]; for _ in 0..n { ans.push(0); } for i in 0..n { if in0[i as usize] ==
2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复比如,arr = 4, 2, 0, 3, 10 1 2 3 4把0想象成洞,任何非0数字都可以来到这个洞里,然后在原本的位置留下洞比如...4这个数字,来到0所代表的洞里,那么数组变成 : arr = 0, 2, 4, 3, 1也就是原来的洞被4填满,4走后留下了洞任何数字只能搬家到洞里,并且走后留下洞通过搬家的方式,想变成有序的,有序有两种形式比如...对于第二种有序情况,我们可以先倒序遍历数组,找出每个数需要移动的最小距离,从而计算出需要移动的次数。最后比较这两种情况下的最小搬动次数,返回较小值即可。...} else {ans1 += m + 1}}}}touched = make([]bool, n)// 1 2 3 4 ... 0// i == n-1for i := n - 1; i >= 0;...n - 1}}if m > 1 {if i == n-1 {ans2 += m - 1} else {ans2 += m + 1}}}}if ans1 1}return
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1,给定正数M,表示实验数量,实验编号从0~M-1,给定长度为N的二维数组A,Ai = { a, b, c }表示,用户i报名参加了a号...、b号、c号实验,给定正数Q,表示查询的条数给定长度为Q的二维数组B,Bi = { e, f }表示,第i条查询想知道e号、f号实验,一共有多少人(去重统计)。...返回每一条查询的结果数组。数据描述 : 1 N 1 1 数组B,行*列的规模) n as i64 + 1) as u32; } else { n2 = n as u32; } let mut n = n2; n = (n & 0x55555555
2022-06-25:给定一个正数n, 表示有0~n-1号任务,给定一个长度为n的数组time,timei表示i号任务做完的时间,给定一个二维数组matrix,matrixj = {a, b} 代表:a...返回一个长度为n的数组ans,表示每个任务完成的时间。输入可以保证没有循环依赖。来自美团。3.26笔试。答案2022-06-25:拓扑排序基础上做动态规划。代码用rust编写。...[0,1],vec![0,2],vec![1,2],vec![3,1],vec!...[]; for _ in 0..n { in0.push(0); } for line in matrix.iter() { nexts[line[1] as...[]; for _ in 0..n { ans.push(0); } for i in 0..n { if in0[i as usize] == 0 {
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和...整个过程要求时间复杂度O(N)。 福大大 答案2021-04-07: 自然智慧即可。 1.算出总累加和。 2.依次遍历,算出左累加和、右累加和。假设最小值是min。...代码如下: package main import "fmt" func main() { arr := []int{1, 2, 3, 0, 0, 100, 1, 1} ret :=...:= len(arr) sumAll := 0 for i := 0; i N; i++ { sumAll += arr[i] } ans := 0...sumL := 0 // [0...s] [s+1...N-1] for s := 0; s N-1; s++ { sumL += arr[s]
用go语言,给定两个数组:order 长度为 n,包含 1 到 n 的所有编号且互不重复,数组中元素的先后位置表示选手完成比赛的先后次序;friends 是一个按升序列出的朋友编号集合,且每个编号都出现在...步骤一:初始化与标记准备 首先,代码会创建一个名为 isFriend 的布尔型切片(slice),其长度为 n+1(n 是 order 数组的长度)。...复杂度分析 • 总的时间复杂度:O(n)。 这是因为代码主要执行了两个简单的线性循环:第一个循环遍历 friends 数组(长度最大为8)来建立标记,其时间复杂度为 O(m),其中 m 是朋友数量。...第二个循环遍历 order 数组(长度为 n)来筛选朋友,其时间复杂度为 O(n)。...这主要是由创建的 isFriend 标记数组导致的,该数组的长度为 n+1,因此需要 O(n) 的额外空间。结果数组 ans 存储朋友编号,其长度最大为8,属于常数空间开销 O(1)。
2026-01-08:三段式数组Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums。...若存在两个下标 p、q,满足 0 n − 1,使得数组可以被划分为三段——从索引 0 到 p 的部分每一步都严格上升、从 p 到 q 的部分每一步都严格下降、从 q 到末尾的部分每一步又严格上升...若数组满足这种模式,返回 true;否则返回 false。 3 n <= 100。 -1000 <= nums[i] <= 1000。 输入: nums = [1,3,5,4,2,6]。...函数的核心是一个单层的for循环,从索引2开始遍历到数组末尾。循环的次数与数组的长度n成线性关系。在循环内部的所有操作(比较、条件判断、计数器递增)都是常数时间O(1)内完成的。...因此,总的时间复杂度是线性阶O(n)。 • 额外空间复杂度:O(1)。 函数执行过程中,只使用了固定数量的额外变量(如cnt、i)。这些变量的数量与输入数组的大小n无关。
2026-02-04:数组元素相等的最小操作次数。用go语言,给定一个长度为 n 的整型数组 nums。...初始化与最终结果 • 初始化:dp[0] = 0,表示前0个元素(空数组)已经处理完毕,操作次数为0。 • 最终结果:对于当前枚举的 target,最小操作次数就是 dp[n](n 为数组长度)。...因此,总的最坏时间复杂度为 O(T * n²)。由于 nums[i] 的值域限制,T 的值不会太大(最多为不同子数组按位与值的个数,远小于 100000)。...对于 n <= 100,这个复杂度是可接受的。 • 额外空间复杂度:算法需要额外的空间主要是 dp 数组,大小为 O(n)。此外,可能需要一个集合来存储候选 target。...因此,总的额外空间复杂度为 O(n)。