首页 > 其他分享 >LeetCode 3285 找到稳定山的下标

LeetCode 3285 找到稳定山的下标

时间:2024-12-16 18:58:42浏览次数:7  
标签:下标 int 复杂度 height stableIndices threshold 3285 LeetCode

问题描述

有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。

对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我们称它是 稳定 的。我们定义下标为 0 的山 不是 稳定的。

请你返回一个数组,包含所有 稳定 山的下标,你可以以 任意 顺序返回下标数组。

解题思路

初次邂逅这道题,脑海中或许会迅速浮现出遍历数组的基础解法。没错,遍历就是那把开启解题大门的钥匙。

从数组的第二位(下标 1)起,逐座山细细端详,查看其左侧邻居是否足够高大,也就是高度大于 threshold。一旦觅得满足此条件的山,便迫不及待地将其下标妥善珍藏起来,静待后续整合。

然而,若想更臻完美,还需深思熟虑一种特殊情形。一座山仅左侧达标还不够,倘若后续冒出更高的山峰,那它的 “稳定” 之名便摇摇欲坠。故而,在初步判断左侧条件后,不妨优雅地开启一段内层小循环,继续探索其后继山脉,确保后续无 “后来居上” 者,方能笃定其稳定地位。

代码实现

#include <stdio.h>
#include <stdlib.h>


//辅助函数
int* stableMountains(int* height, int heightSize, int threshold, int* returnSize) {
    int* stableIndices = (int*)malloc(sizeof(int) * heightSize);//动态分配内存
    int count = 0;

    for (int i = 1; i < heightSize; i++) {
        if (height[i - 1] > threshold) {
            stableIndices[count++] = i;
        }
    }

    *returnSize = count;
    if (count == 0) {
        free(stableIndices);
        return NULL;
    }
    return stableIndices;
}

int main(){
    //定义数组
    int height[] = {1,2,3,4,5};
    int heightSize = sizeof(height) / sizeof(height[0]); // 数组大小
    //定义需要满足的要求
    int threshold = 2;
    int returnSize; // 稳定山的数量

    int* stableIndices = stableMountains(height, heightSize, threshold, &returnSize);

    // 打印稳定山的下标
    printf("Stable Mountain indices: ");
    for (int i = 0; i < returnSize; i++) {
        printf("%d ", stableIndices[i]);
    }
    printf("\n");

    // 释放分配的内存
    free(stableIndices);

    return 0;
}

复杂度分析

  • 时间复杂度:主要受外层循环和内层循环牵制。外层循环遍历 n - 1 座山,每次内层循环最坏情况要扫视剩余山脉,故而整体时间复杂度为O(n^{2}) ,不过平均状况下,内层循环不会全程奔波,复杂度稍显乐观。
  • 空间复杂度:因稳定山下标数组在极端时可与原数组等大,所以空间复杂度是 O(n),额外变量皆为常量级,不影响大局。

优化拓展

优化方向:时间复杂度上,单调栈方案堪称妙策。借助单调递减栈存储山脉高度,遍历之际,入栈出栈行云流水,轻松定位稳定山,瞬间将复杂度降至 O(n)。空间管理方面,若稳定山稀缺,动态扩容机制可大显身手,按需分配内存,避免空间浪费。同时,强化输入参数校验,如杜绝 height 为空、管控 threshold 值域,让程序坚如磐石。

 

标签:下标,int,复杂度,height,stableIndices,threshold,3285,LeetCode
From: https://blog.csdn.net/qq_64604732/article/details/144491158

相关文章

  • LeetCode771 宝石与石头
    题目描述给定一个字符串 jewels,它代表石头中宝石的类型;另有一个字符串 stones,代表我们拥有的石头。其中,stones 里的每个字符对应一种石头类型,任务是要精准地统计出在 stones 当中,属于 jewels 所定义的宝石类型的石头究竟有多少。这里需特别注意,字母区分大小写,像 "a"......
  • LeetCode面试题04 检查平衡性
    题目:实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过1。一、平衡树定义:二叉树,一种由节点组成的树形数据结构,每个节点最多有两个子节点,分别称作左子节点和右子节点。而平衡二叉树,可不是普通的二叉树,它有着严苛的要求:对......
  • LeetCode 1844将所有数字用字符替换
    题目:给你一个下标从 0 开始的字符串 s ,它的 偶数 下标处为小写英文字母,奇数 下标处为数字。定义一个函数 shift(c,x) ,其中 c 是一个字符且 x 是一个数字,函数返回字母表中 c 后面第 x 个字符。运行代码:#include<stdio.h>#include<string.h>//实现替......
  • leetcode2055. 蜡烛之间的盘子 - 前缀和
    2055.蜡烛之间的盘子这道题目作为比较单纯的前缀和题目,不需要额外的一些知识,只需要了解前缀和数组的生成与使用即可,并且也有一定的难度(难度分1819),是一个比较好的前缀和例题。题干算术评级:6第64场双周赛Q3给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从0开始......
  • LeetCode题练习与总结:连接词--472
    一、题目描述给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。连接词 定义为:一个完全由给定数组中的至少两个较短单词(不一定是不同的两个单词)组成的字符串。示例1:输入:words=["cat","cats","catsdogcats","dog","dogcatsdog......
  • LeetCode题练习与总结:火柴拼正方形--473
    一、题目描述你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。如果你能使这个正方形,则返回 true ,否则返......
  • leetcode 1481. 不同整数的最少数目
    1481.不同整数的最少数目classSolution{public:intfindLeastNumOfUniqueInts(vector<int>&arr,intk){unordered_map<int,int>numAdded;for(int&num:arr)++numAdded[num];vector<pair<int,int>>num......
  • 代码随想录算法训练营第四十六天|leetcode647. 回文子串、leetcode516.最长回文子序列
    1leetcode647.回文子串题目链接:647.回文子串-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划,字符串性质决定了DP数组的定义|LeetCode:647.回文子串哔哩哔哩bilibili思路:嘿,看不懂有一点,看解析吧1.1视频后的方法其实看完视频以后,感觉这个题目真的不难,我想到了二维......
  • 代码随想录算法训练营第四十五天|leetcode115.不同的子序列、leetcode583. 两个字符串
    1leetcode115.不同的子序列题目链接:115.不同的子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之子序列,为了编辑距离做铺垫|LeetCode:115.不同的子序列哔哩哔哩bilibili思路:确实看不懂题目,还是看解析吧1.1视频后的方法有一种我看了视频,也没有那么理解是为......
  • 代码随想录算法训练营第四十四天|leetcode1143.最长公共子序列、leetcode1035.不相交
    1leetcode1143.最长公共子序列题目链接:1143.最长公共子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划子序列问题经典题目|LeetCode:1143.最长公共子序列哔哩哔哩bilibili思路:其实我比较清楚的是和上面一道题目的思路,差不太多,但是我不知道非连续的位置应该如何......