2026-05-26移除前缀使数组严格递增。用go语言给定整数数组 nums你可以从数组开头“删掉一段连续的前缀”前缀长度可以为 0。要求删除后剩下的部分必须是严格递增的即剩余数组中任意相邻两项满足后者 前者。在满足条件的前提下返回“需要删除的前缀”的最小长度。1 nums.length 100000。-1000000000 nums[i] 1000000000。输入 nums [1,-1,2,3,3,4,5]。输出 4。解释移除前缀 prefix [1, -1, 2, 3] 后剩余数组为 [3, 4, 5]严格递增。题目来自力扣3818。算法执行详细过程第一步明确核心目标我们需要找到最短的需要删除的前缀长度使得删除后剩余的数组是严格递增后一个数 前一个数。核心思路从后往前遍历数组找到最长的、满足严格递增的后缀子数组剩下的前面部分就是需要删除的最短前缀。第二步确定数组基础信息数组长度7数组元素索引0:11:-12:23:34:35:46:5第三步从后往前遍历数组核心判断步骤遍历规则从数组最后一个元素开始向前逐个检查相邻两个元素是否满足严格递增后一个 前一个一旦发现不满足立即确定结果。检查索引 5 和 6元素是 4 和 54 5满足严格递增继续向前检查。检查索引 4 和 5元素是 3 和 43 4满足严格递增继续向前检查。检查索引 3 和 4元素是 3 和 33 不小于 3不满足严格递增遍历终止。第四步计算需要删除的最短前缀长度遍历终止时当前索引是4代码返回的值就是需要删除的前缀长度 4。第五步验证结果正确性删除长度为4的前缀移除索引0、1、2、3的元素[1, -1, 2, 3]剩余数组[3, 4, 5]满足严格递增且这是最短的删除长度。时间复杂度 额外空间复杂度1. 时间复杂度算法只执行了一次从后往前的单循环遍历遍历次数最多等于数组长度n。没有嵌套循环、没有递归所有操作都是常数级O(1)。总时间复杂度O(n)n 为数组长度。2. 额外空间复杂度算法全程没有创建任何新的数组/集合只使用了几个临时变量循环变量、返回值。额外占用的内存空间与输入数组长度无关是固定大小。总额外空间复杂度O(1)。总结执行过程从后往前遍历数组找到第一个不满足严格递增的相邻位置该位置的索引就是需要删除的最短前缀长度时间复杂度O(n)高效适配题目 10万长度的数组要求额外空间复杂度O(1)原地计算无额外内存开销。Go完整代码如下packagemainimport(fmt)funcminimumPrefixLength(nums[]int)int{fori:len(nums)-1;i0;i--{ifnums[i-1]nums[i]{returni// 移除前缀 [0, i-1]长度为 i}}return0}funcmain(){nums:[]int{1,-1,2,3,3,4,5}result:minimumPrefixLength(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defminimum_prefix_length(nums):foriinrange(len(nums)-1,0,-1):ifnums[i-1]nums[i]:returni# 移除前缀 [0, i-1]长度为 ireturn0defmain():nums[1,-1,2,3,3,4,5]resultminimum_prefix_length(nums)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevectorintminimumPrefixLength(conststd::vectorintnums){for(intinums.size()-1;i0;i--){if(nums[i-1]nums[i]){returni;// 移除前缀 [0, i-1]长度为 i}}return0;}intmain(){std::vectorintnums{1,-1,2,3,3,4,5};intresultminimumPrefixLength(nums);std::coutresultstd::endl;return0;}
2026-05-26:移除前缀使数组严格递增。用go语言,给定整数数组 nums,你可以从数组开头“删掉一段连续的前缀”(前缀长度可以为 0)。要求删除后剩下的部分必须是严格递增的(即剩余数组中任意相
2026-05-26移除前缀使数组严格递增。用go语言给定整数数组 nums你可以从数组开头“删掉一段连续的前缀”前缀长度可以为 0。要求删除后剩下的部分必须是严格递增的即剩余数组中任意相邻两项满足后者 前者。在满足条件的前提下返回“需要删除的前缀”的最小长度。1 nums.length 100000。-1000000000 nums[i] 1000000000。输入 nums [1,-1,2,3,3,4,5]。输出 4。解释移除前缀 prefix [1, -1, 2, 3] 后剩余数组为 [3, 4, 5]严格递增。题目来自力扣3818。算法执行详细过程第一步明确核心目标我们需要找到最短的需要删除的前缀长度使得删除后剩余的数组是严格递增后一个数 前一个数。核心思路从后往前遍历数组找到最长的、满足严格递增的后缀子数组剩下的前面部分就是需要删除的最短前缀。第二步确定数组基础信息数组长度7数组元素索引0:11:-12:23:34:35:46:5第三步从后往前遍历数组核心判断步骤遍历规则从数组最后一个元素开始向前逐个检查相邻两个元素是否满足严格递增后一个 前一个一旦发现不满足立即确定结果。检查索引 5 和 6元素是 4 和 54 5满足严格递增继续向前检查。检查索引 4 和 5元素是 3 和 43 4满足严格递增继续向前检查。检查索引 3 和 4元素是 3 和 33 不小于 3不满足严格递增遍历终止。第四步计算需要删除的最短前缀长度遍历终止时当前索引是4代码返回的值就是需要删除的前缀长度 4。第五步验证结果正确性删除长度为4的前缀移除索引0、1、2、3的元素[1, -1, 2, 3]剩余数组[3, 4, 5]满足严格递增且这是最短的删除长度。时间复杂度 额外空间复杂度1. 时间复杂度算法只执行了一次从后往前的单循环遍历遍历次数最多等于数组长度n。没有嵌套循环、没有递归所有操作都是常数级O(1)。总时间复杂度O(n)n 为数组长度。2. 额外空间复杂度算法全程没有创建任何新的数组/集合只使用了几个临时变量循环变量、返回值。额外占用的内存空间与输入数组长度无关是固定大小。总额外空间复杂度O(1)。总结执行过程从后往前遍历数组找到第一个不满足严格递增的相邻位置该位置的索引就是需要删除的最短前缀长度时间复杂度O(n)高效适配题目 10万长度的数组要求额外空间复杂度O(1)原地计算无额外内存开销。Go完整代码如下packagemainimport(fmt)funcminimumPrefixLength(nums[]int)int{fori:len(nums)-1;i0;i--{ifnums[i-1]nums[i]{returni// 移除前缀 [0, i-1]长度为 i}}return0}funcmain(){nums:[]int{1,-1,2,3,3,4,5}result:minimumPrefixLength(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defminimum_prefix_length(nums):foriinrange(len(nums)-1,0,-1):ifnums[i-1]nums[i]:returni# 移除前缀 [0, i-1]长度为 ireturn0defmain():nums[1,-1,2,3,3,4,5]resultminimum_prefix_length(nums)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevectorintminimumPrefixLength(conststd::vectorintnums){for(intinums.size()-1;i0;i--){if(nums[i-1]nums[i]){returni;// 移除前缀 [0, i-1]长度为 i}}return0;}intmain(){std::vectorintnums{1,-1,2,3,3,4,5};intresultminimumPrefixLength(nums);std::coutresultstd::endl;return0;}