首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2026-01-08:三段式数组Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums。若存在两个下标 p、q,满足 0 < p < q < n − 1,使得数组可以

2026-01-08:三段式数组Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums。若存在两个下标 p、q,满足 0 < p < q < n − 1,使得数组可以

作者头像
福大大架构师每日一题
发布2026-01-12 11:10:48
发布2026-01-12 11:10:48
1850
举报

2026-01-08:三段式数组Ⅰ。用go语言,给定一个长度为 n 的整数数组 nums。若存在两个下标 p、q,满足 0 < p < q < n − 1,使得数组可以被划分为三段——从索引 0 到 p 的部分每一步都严格上升、从 p 到 q 的部分每一步都严格下降、从 q 到末尾的部分每一步又严格上升——则称数组符合“上升→下降→上升”的模式。若数组满足这种模式,返回 true;否则返回 false。

3 <= n <= 100。

-1000 <= nums[i] <= 1000。

输入: nums = [1,3,5,4,2,6]。

输出: true。

解释:

选择 p = 2, q = 4:

nums[0...2] = [1, 3, 5] 严格递增 (1 < 3 < 5)。

nums[2...4] = [5, 4, 2] 严格递减 (5 > 4 > 2)。

nums[4...5] = [2, 6] 严格递增 (2 < 6)。

题目来自力扣3637。

🔍 判断过程详解

  1. 1. 初始检查 函数首先检查数组的前两个元素nums[0]nums[1]。由于三段式模式要求第一段必须是严格上升的,如果nums[0] >= nums[1],意味着一开始就没有上升,函数会立即返回false
  2. 2. 遍历与模式变化计数 接下来,函数从索引i=2开始遍历数组,直到最后一个元素。
    • 检查相邻元素是否相等:在遍历过程中,如果发现任何相邻元素nums[i-1]nums[i]相等,由于题目要求每一步都必须是“严格”上升或下降,函数会立即返回false
    • 检测趋势变化:核心逻辑是判断趋势是否改变。代码通过比较连续两个区间的单调性来判断:(nums[i-2] < nums[i-1])判断的是前一个区间的趋势(例如,从索引i-2i-1),而(nums[i-1] < nums[i])判断的是当前区间的趋势(从索引i-1i)。如果这两个布尔表达式的结果不相等(使用 != 进行比较),就说明在索引i-1这个位置,数组的趋势发生了改变(例如从上升变为下降,或从下降变为上升)。每当检测到一次趋势变化,计数器cnt就增加1。
  3. 3. 结果判定 遍历结束后,函数检查趋势变化的次数cnt是否等于3。为什么是3?因为一个完整的三段式“上升→下降→上升”模式,其趋势变化点应该是:
    • • 在p点,从上升变为下降(第1次变化)。
    • • 在q点,从下降变为上升(第2次变化)。 然而,你的代码逻辑中,计数器cnt的初始值设为1,而不是0。这意味着它默认从某个“状态”开始计数。在遍历中,当找到第一个变化点(即p点,上升变下降)时,cnt增加到2;找到第二个变化点(即q点,下降变上升)时,cnt增加到3。因此,最终判断cnt == 3意味着找到了完整的两个趋势变化点,从而确定数组符合三段式模式。

⏱️ 复杂度分析

  • 时间复杂度O(n)。 函数的核心是一个单层的for循环,从索引2开始遍历到数组末尾。循环的次数与数组的长度n成线性关系。在循环内部的所有操作(比较、条件判断、计数器递增)都是常数时间O(1)内完成的。因此,总的时间复杂度是线性阶O(n)。
  • 额外空间复杂度O(1)。 函数执行过程中,只使用了固定数量的额外变量(如cnti)。这些变量的数量与输入数组的大小n无关。因此,额外的空间复杂度是常数阶O(1)。

Go完整代码如下:

.

代码语言:javascript
复制
package main

import (
    "fmt"
)

func isTrionic(nums []int)bool {
    if nums[0] >= nums[1] { // 一开始必须是递增的
        returnfalse
    }
    cnt := 1
    for i := 2; i < len(nums); i++ {
        if nums[i-1] == nums[i] {
            returnfalse
        }
        if (nums[i-2] < nums[i-1]) != (nums[i-1] < nums[i]) {
            cnt++
        }
    }
    return cnt == 3// 一定是增减增
}

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

Python完整代码如下:

.

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

def is_trionic(nums):
    if nums[0] >= nums[1]:  # 一开始必须是递增的
        return False
    
    cnt = 1
    for i in range(2, len(nums)):
        if nums[i-1] == nums[i]:
            return False
        if (nums[i-2] < nums[i-1]) != (nums[i-1] < nums[i]):
            cnt += 1
    
    return cnt == 3  # 一定是增减增

if __name__ == "__main__":
    nums = [1, 3, 5, 4, 2, 6]
    result = is_trionic(nums)
    print(result) 
在这里插入图片描述
在这里插入图片描述

C++完整代码如下:

.

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

using namespace std;

bool isTrionic(const vector<int>& nums) {
    if (nums[0] >= nums[1]) { // 一开始必须是递增的
        returnfalse;
    }

    int cnt = 1;
    for (size_t i = 2; i < nums.size(); i++) {
        if (nums[i-1] == nums[i]) {
            returnfalse;
        }
        if ((nums[i-2] < nums[i-1]) != (nums[i-1] < nums[i])) {
            cnt++;
        }
    }
    return cnt == 3; // 一定是增减增
}

int main() {
    vector<int> nums = {1, 3, 5, 4, 2, 6};
    bool result = isTrionic(nums);
    cout << boolalpha << result << endl;

    return0;
}
在这里插入图片描述
在这里插入图片描述

·


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

·

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔍 判断过程详解
  • ⏱️ 复杂度分析
  • Go完整代码如下:
  • Python完整代码如下:
  • C++完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档