首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2026-05-26:移除前缀使数组严格递增。用go语言,给定整数数组 nums,你可以从数组开头“删掉一段连续的前缀”(前缀长度可以为 0)。要

2026-05-26:移除前缀使数组严格递增。用go语言,给定整数数组 nums,你可以从数组开头“删掉一段连续的前缀”(前缀长度可以为 0)。要

作者头像
福大大架构师每日一题
发布2026-05-26 19:35:25
发布2026-05-26 19:35:25
210
举报

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:1,1:-1,2:2,3:3,4:3,5:4,6:5

第三步:从后往前遍历数组(核心判断步骤)

遍历规则:从数组最后一个元素开始,向前逐个检查相邻两个元素是否满足严格递增(后一个 > 前一个),一旦发现不满足,立即确定结果。

  1. 1. 检查索引 5 和 6:元素是 4 和 5 4 < 5,满足严格递增,继续向前检查。
  2. 2. 检查索引 4 和 5:元素是 3 和 4 3 < 4,满足严格递增,继续向前检查。
  3. 3. 检查索引 3 和 4:元素是 3 和 3 3 不小于 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)

总结

  1. 1. 执行过程:从后往前遍历数组,找到第一个不满足严格递增的相邻位置,该位置的索引就是需要删除的最短前缀长度;
  2. 2. 时间复杂度:O(n),高效适配题目 10万长度的数组要求;
  3. 3. 额外空间复杂度:O(1),原地计算,无额外内存开销。

Go完整代码如下:

.

代码语言:javascript
复制
package main

import (
    "fmt"
)

func minimumPrefixLength(nums []int) int {
    for i := len(nums) - 1; i > 0; i-- {
        if nums[i-1] >= nums[i] {
            return i // 移除前缀 [0, i-1],长度为 i
        }
    }
    return 0
}

func main() {
    nums := []int{1, -1, 2, 3, 3, 4, 5}
    result := minimumPrefixLength(nums)
    fmt.Println(result)
}
在这里插入图片描述
在这里插入图片描述

Python完整代码如下:

.

代码语言:javascript
复制
# -*-coding:utf-8-*-

def minimum_prefix_length(nums):
    for i in range(len(nums) - 1, 0, -1):
        if nums[i - 1] >= nums[i]:
            return i  # 移除前缀 [0, i-1],长度为 i
    return 0


def main():
    nums = [1, -1, 2, 3, 3, 4, 5]
    result = minimum_prefix_length(nums)
    print(result)


if __name__ == "__main__":
    main()
在这里插入图片描述
在这里插入图片描述

C++完整代码如下:

.

代码语言:javascript
复制
#include <iostream>
#include <vector>

int minimumPrefixLength(const std::vector<int>& nums) {
    for (int i = nums.size() - 1; i > 0; i--) {
        if (nums[i - 1] >= nums[i]) {
            return i; // 移除前缀 [0, i-1],长度为 i
        }
    }
    return 0;
}

int main() {
    std::vector<int> nums = {1, -1, 2, 3, 3, 4, 5};
    int result = minimumPrefixLength(nums);
    std::cout << result << std::endl;
    return 0;
}
在这里插入图片描述
在这里插入图片描述

·


我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 算法执行详细过程
    • 第一步:明确核心目标
    • 第二步:确定数组基础信息
    • 第三步:从后往前遍历数组(核心判断步骤)
    • 第四步:计算需要删除的最短前缀长度
    • 第五步:验证结果正确性
  • 时间复杂度 & 额外空间复杂度
    • 1. 时间复杂度
    • 2. 额外空间复杂度
      • 总结
  • Go完整代码如下:
  • Python完整代码如下:
  • C++完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档