首页 > 编程问答 >有效山阵

有效山阵

时间:2024-08-06 03:54:41浏览次数:6  
标签:python arrays c algorithm

我想知道是否有一种编程方法来确定数组是否具有完美的山脉图案,没有山谷。 (图中的示例)

来源: https://leetcode.com/problems/valid-mountain-array/

example of mountain/not a mountain array

编辑:

我在 C: 中的尝试

#include<stdio.h>

int AscOrDes(int a[], int first, int last)
{
    int i;
    for(i=first; i<last; i++)
    {
        if(a[i]>a[i+1])
            return(1);
        else if(a[i]<a[i+1])
            return(2);
    }
    return 0;
}

int main() {
    int a[1000],n,i,big=0,r1,r2;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0; i<n; i++)
    {
        if(a[i]>=a[big])
            big=i;
    }
    r1=AscOrDes(a, 0, big);
    r2=AscOrDes(a, big, n);
    if(r1==2 && r2==1 && big!=0 && big!=n-1)
        printf("True");
    else
        printf("False");
    return 0;
}

上面的代码没有对于以下输入不起作用:

8
1 3 2 5 4 3 2 0

它给出输出:

True

即使它不是完美的山数组。

我在程序中所做的是检查哪个元素是最大的(|| |),并检查最大元素左侧的元素是否按升序排列,右侧的元素是否按降序排列(山应该如何)。 big ), and checked if the elements on the left side of the largest element are in ascending order and those on the right side are in descending order (how the mountain should be).


你的 C 代码的问题在于你的 AscOrDes 函数可以确定一个序列是严格递增还是递减,但在遇到不同趋势时会过早停止。例如,在序列 1 3 2 5 中,函数会在看到 3 > 2 时返回 1 (递减),即使后面的序列是递增的。

以下是解决此问题的 C 代码的更正版本:

#include <stdio.h>
#include <stdbool.h>

bool isMountainArray(int arr[], int n) {
    if (n < 3) {
        return false; 
    }

    int i = 0;

    // 向上攀登
    while (i < n - 1 && arr[i] < arr[i + 1]) {
        i++;
    }

    // 峰值不能是第一个或最后一个元素
    if (i == 0 || i == n - 1) {
        return false;
    }

    // 向下攀登
    while (i < n - 1 && arr[i] > arr[i + 1]) {
        i++;
    }

    // 检查是否到达了数组的末尾
    return i == n - 1;
}

int main() {
    int a[1000], n;

    printf("输入数组的大小:");
    scanf("%d", &n);

    printf("输入数组元素:");
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    if (isMountainArray(a, n)) {
        printf("True\n");
    } else {
        printf("False\n");
    }

    return 0;
}

以下是代码的工作原理:

  1. 处理基本情况: 如果数组的元素少于 3 个,它就不能形成山脉,因此返回 false
  2. 向上攀登: 代码从数组的开头开始,只要当前元素小于下一个元素就继续前进。这表示数组的递增部分。
  3. 检查峰值: 在递增部分结束后,代码检查峰值是否不是数组的第一个或最后一个元素。如果是,则该数组不是山脉数组,因此返回 false
  4. 向下攀登: 从峰值开始,代码继续前进,只要当前元素大于下一个元素。这表示数组的递减部分。
  5. 验证并返回: 如果代码到达数组的末尾,则表示该数组是一个有效的山脉数组,因此返回 true 。否则,返回 false

此代码现在将正确地确定给定数组是否是山脉数组,而不会遇到之前解决方案中遇到的问题。

标签:python,arrays,c,algorithm
From: 73091436

相关文章

  • 在 TfidfVectorizer 标记化后删除二元组
    我正在尝试删除由TfidfVectorizer创建的二元组。我正在使用text.TfidfVectorizer,以便我可以使用自己的预处理器函数。Initfromsklearn.feature_extraction.textimportENGLISH_STOP_WORDSasstop_wordsfromsklearn.feature_extraction.textimportTfidfV......
  • Deepface - 仅以超过阈值的置信度显示面部的情绪
    我有这段代码可以检测面部表情,但它会在没有面部表情的地方找到面部表情。所以我想知道是否可以放心地做到这一点。我尝试在谷歌上搜索如何做到这一点,但没有找到任何有用的东西。importcv2fromdeepfaceimportDeepFace#Loadfacecascadeclassifierface_cascade=......
  • Langchain、Ollama 和 Llama 3 提示和响应
    目前,我正在返回多个响应,或者模型不知道何时结束响应,并且似乎在响应中重复系统提示(?)。我只想得到一个回复​​。我的设置非常简单,所以我想我缺少实现细节,但是我该怎么做才能只返回单个响应?fromlangchain_community.llmsimportOllamallm=Ollama(model="llama3")defget_m......
  • 与 scipy ODR 的正确拟合包括错误吗?
    我有一些数据点的x和y坐标都有错误。因此我需要使用python的scipy.odr.ODR工具来计算最佳拟合斜率和该斜率上的误差。但是,当我尝试添加错误时,ODR失败并仅返回初始猜测参数。我尝试运行它而没有错误,并且它按预期工作:#Importstatementsimportnumpyasnpi......
  • windows C++-使用 C++/WinRT 创作 API(一)
    这个系列中的"投影”不太好有准确的翻译,它的原文是"projection",最开始我觉得可能翻译为实现,但C++本身也有"实现(implementation )",这两个不同的词翻译为一个总觉得怪怪的。本文展示了如何直接或间接使用winrt::implements基本结构来拓展创作C++/WinRTAPI。在此上......
  • windows C++-使用 C++/WinRT 创作 API(二)
    可扩展应用程序标记语言(XAML)是一种声明性语言。具体来讲,XAML可初始化对象和设置对象的属性,使用一种可显示多个对象间分层关系的语言结构,还使用了一种支持类型扩展的支持类型约定。可以在声明性XAML标记中创建可见的UI元素。然后,可以为每个XAML文件关联单独的代码隐藏......
  • 【视频讲解】Xgboost、ARIMA 和 Prophet对国际牛肉市场市场份额数据、比特币价格时间
    原文链接:https://tecdat.cn/?p=37228原文出处:拓端数据部落公众号分析师:KechenZhao本文将通过视频讲解,展示如何用Xgboost、ARIMA和Prophet对国际牛肉市场市场份额数据时间序列预测,并结合一个Python# ARIMA、XGBOOST、PROPHET和LSTM预测比特币价格实例的代码数据,为读者提供一......
  • C++ 拷贝构造函数语义与移动构造函数语义
    拷贝构造函数语义与移动构造函数语义一、拷贝构造函数语义1.编译器生成拷贝构造函数的条件2.自定义拷贝构造函数3.深拷贝与浅拷贝4.拷贝构造函数的使用场景5.拷贝赋值运算符6.规则五(RuleofFive)二、移动构造函数语义1.禁止生成移动构造函数2.生成移动构造函数......
  • 【香橙派系列教程】(七)香橙派下的Python3安装
    【七】香橙派下的Python3安装为接下来的Linux图像识别智能垃圾桶做准备。图像处理使用京东SDK只支持pyhton和Java接口,目的是引入C语言的Python调用,感受大厂做的算法bug此接口是人工智能接口,京东识别模型是通过训练后的模型,精准度取决于训练程度,人工智能范畴在常规嵌入式......
  • leetcode力扣第29题:两数相除
    这题看似简单,实则一点也不难(不是),实则还是比较困难。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。所以一定要有更好的思路(1)通过二分法查找可能的商(2)对于......