c++_leetcode_寻找峰值

news2024/12/22 17:09:24

目录

一、寻找峰值的示例

二、官方实现代码及解释

1、官方测试结果:

2、代码解释:

3、解题思路:

三、我的暴力解决

1、测试一:

2、测试二:

3、最终“暴力求解”代码:

4、官网提交测试通过:

 5、解题思路:

四、c++函数max_element()解决

1、函数使用介绍:

2、max_element() 峰值寻找完整代码:


一、寻找峰值的示例

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = [1,2,1,3,5,6,4]输出:1 或 5 
解释:你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6。

提示:

  • 1 <= nums.length <= 1000
  • -231 <= nums[i] <= 231 - 1
  • 对于所有有效的 i 都有 nums[i] != nums[i + 1]

二、官方实现代码及解释

1、官方测试结果:

2、代码解释:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {


        //1、准备工作:获得nums、生成随机索引值

        //随机索引值可以在一定概率上可以快速得到峰值,最好情况是刚好随机到峰值数的索引,最差情况是刚好随机到距离峰值最远的元素
        int n = nums.size();  //得到nums数据长度
        int idx = rand() % n;  //随机生成0~n-1的索引idx值


         //2、设计函数get,输入i,得到数组对(0/1, nums[i])

        // 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i])
        // 方便处理 nums[-1] 以及 nums[n] 的边界情况

        auto get  = [&](int i)->pair<int,int>{
            if(i==-1||i==n)
            {
                return{0,0};
            }
            return {1,nums[i]};
        };

详细解释lambda表达式:

  • get是函数名
  • [&]是所有变量以引用捕获的方式传入到表达式中,也就是i传入后可访问、修改
  • (int i)是参数列表,这里参数是整型
  • -> pair<int,int>是返回值类型为pair<int,int>,定义为两个int型的数据对
  • {} 里面是函数体,此处返回(0/1, nums[i]),0是超过边界的数对,1是符合边界0~n-1的所有数对

        while(!(get(idx - 1)<get(idx)&&get(idx)>get(idx + 1))){
            if(get(idx)<get(idx+1))
            {
                idx += 1;
            }
            else
            {
                idx -= 1;
            }
        }

        return idx;

    }
};

3、解题思路:

(1)当不是峰值的数时,峰值出现在idx的左边或者右边,索引值idx<idx+1时峰值索引变成idx+1,相反idx<idx-1,峰值索引变为idx-1。

(2)i值大于i+1且i值小于i-1

三、我的暴力解决

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int n=nums.size();
        int idx = 0;
        for(int i = 1;i<n-1;i++)
        {
            if(n==2)
            {
                if(nums[i] > nums[i-1])
                {
                    idx = i;
                    break;
                }
                else if(nums[i] < nums[i-1])
                {
                   idx = i-1;
                    break; 
                }
            }
            if(nums[i] > nums[i+1] && nums[i] > nums[i-1]) {
            idx = i;
            break; }

        }

        return idx;
    }
};

1、测试一:

测试用例失败:nums =[1,2],输出0,期望是1

调试一下发现循环条件"n<n-1",当n=2时,n<1,n从1开始,所以没有进入循环判断"if(n==2)"的条件,测试nums =[1,2]案例失败。

修改while循环条件,得到正确输出:

但是,似乎不行呀,执行nums=[1,2,3,4]的时候,没有峰值,所以出错

所以,我发现,官方给的答案确实有他的道理!!!这里没考虑峰值为单边的情况,比如只有上坡或者只有下坡,单独“if (nums[i] > nums[i + 1] && nums[i] > nums[i - 1])”就会报以上的错误了。

2、测试二:

考虑新增上下坡的情况判断 

if (i + 1 == n)
        {
            if (nums[i] > nums[i - 1])
            {
                idx = i;
                break;
            }
            if (nums[i] < nums[i - 1])
            {
                break;
            }
        }

Yes,测试下坡vector<int> nums = {4,3,2,1}通过: 测试上坡vector<int> nums = {1,2,3,4}通过:

3、最终“暴力求解”代码:

在vs上测试代码Solution.cpp、Solution.h、 main.cpp

Solution.cpp

#include "Solution.h"

int Solution::findPeakElement(vector<int>& nums)
{
    int n = nums.size();
    int idx = 0;
    for (int i = 1; i < n ; i++)
    {
        if (n == 2)
        {
            if (nums[i] > nums[i - 1])
            {
                idx = i;
                break;
            }
            else if (nums[i] < nums[i - 1])
            {
                idx = i - 1;
                break;
            }
        }
        if (i + 1 == n)
        {
            if (nums[i] > nums[i - 1])
            {
                idx = i;
                break;
            }
            if (nums[i] < nums[i - 1])
            {
                break;
            }
        }
        if (nums[i] > nums[i + 1] && nums[i] > nums[i - 1]) {
            idx = i;
            break;
        }

    }

    return idx;
}


Solution.h

#pragma once
#include<vector>
using namespace std;
class Solution
{
public:
	int findPeakElement(vector<int>& nums);
};

 mian.cpp

#include<iostream>
using namespace std;
#include"Solution.h"

int main()
{
    vector<int> nums = {4,3,2,1};
    
    Solution Func;
    int index = Func.findPeakElement(nums);

    cout << index << endl;
}

4、官网提交测试通过:

 5、解题思路:

  • 首先想到nums的峰值元素满足条件1:if(nums[i]>nums[i+1]&&nums[i]<nums[i-1]);
  • 提交1后,nums=[1]只有一个元素时,idx应该返回0;所以idx初始值为0;
  • 提交2后,nums=[1,2]只有两个元素时,idx应该等于较大元素,增加两个元素时条件2:if(n==2)时idx=较大值索引;
  • 提交3后,只有上下坡报错,新增条件3:nums=[1,2,3,4]上坡时,idx应该等于最后一个元素的索引;下坡nums=[4,3,2,1]时,idx应该等于最后一个元素的索引;
  • 注意for循环范围for (int i = 1; i < n ; i++)。

四、c++函数max_element()解决

我真的栓Q了,原来函数解决这么简单哦! 

1、函数使用介绍:

max_element()min_element()分别用来求vector容器的最大元素和最小元素的位置

1)vector容器
vector<int> n;
int maxPosition = max_element(n.begin(),n.end()) - n.begin(); //最大值下标
int minPosition = min_element(n.begin(),n.end()) - n.begin();//最小值下标

2)普通数组
int a[]={1,2,3,4};
int maxPosition = max_element(a,a+4) - a; //最大值下标
int minPosition = min_element(a,a+4) - a;//最小值下标

3)最大值最小值
int maxValue1 = *max_element(nums.begin(), nums.end()); //vector最大值
int minValue1 = *min_element(nums.begin(), nums.end());//vector最小值
int maxValue2 = *max_element(a, a + 4); //a[]最大值
int minValue2 = *min_element(a, a + 4);//a[]最小值

2、max_element() 峰值寻找完整代码:

#include<iostream>
using namespace std;
#include <algorithm>

int main()
{
    vector<int> nums = {4,3,2,1};

    int index = max_element(nums.begin(), nums.end()) - nums.begin(); //最大值下标
    cout <<"vector下最大值下标:" << index << endl;

    int a[] = { 4,3,2,1 };
    int maxIdx = max_element(a, a + 4) - a;
    cout << "a[]   下最大值下标:"  << maxIdx << endl;

    int maxValue1 = *max_element(nums.begin(), nums.end()); //最大值
    int minValue1 = *min_element(nums.begin(), nums.end());//最小值
    int maxValue2 = *max_element(a, a + 4); //最大值
    int minValue2 = *min_element(a, a + 4);//最小值

    cout << "vector下的max值:" << maxValue1 << "  min值:" << minValue1 << endl;
    cout << "a[]   下的max值:" << maxValue1 << "  min值:" << minValue2 << endl;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1482385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中<style scoped lang=“scss“>的含义

这段代码中的<style scoped lang"scss">是HTML和Vue框架结合使用时常见的一个模式&#xff0c;具体含义如下&#xff1a; scoped&#xff1a;这是一个Vue.js特有的属性&#xff0c;用来指定样式只应用于当前组件的元素。没有这个属性时&#xff0c;样式会全局应…

Day08-【Java SE进阶】面向对象高级二——多态、final、抽象类、接口

一、多态 对象多态多态是在继承/实现情况下的一种现象&#xff0c;表现为对象多态和行为多态。 对象多态&#xff1a;一个人可以是学生也可以是老师&#xff0c;学生和老师都是人的子类&#xff0c;创建人对象让其指向不同的对象&#xff0c;称为对象多态&#xff0c;这里是向…

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求) 2.重试加大流量(用户重试,代码逻辑重试) 3.服…

NebulaGraph入门

感谢阅读 官方文档链接NebulaGraph简介nGQLnGQL简介占位标识符和占位符值注释实列大小写区分关键字 基本概念以及相关代码实现补充说明图空间语法以及列子创建克隆官方示例代码(创建并克隆)USE语句指定图空间时查看所有SPACESPACE详情CLEAR SPACE删库跑路&#xff08;看玩笑的说…

CPU,ISA架构,CPU位数与内存

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09;是计算机系统中的主要组件之一&#xff0c;负责执行程序指令并进行数据处理。我们之前已经介绍了CPU与冯诺依曼机CPU与冯诺依曼机-CSDN博客&#xff0c;而ISA&#xff08;Instruction Set Architectu…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

WPF真入门教程30--顺风物流单据管理系统

1、教程回顾 到现在为止&#xff0c;真入门系列教程已完成了29刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;提供一个完整有效的综合项目&#xff0c;本项目采用的是…

汽车虚拟仿真技术的实现、应用和未来

汽车虚拟仿真技术是一种利用计算机模拟汽车运行的技术&#xff0c;以实现对汽车行为的分析、评估和改进。汽车虚拟仿真技术是汽车工业中重要的开发设计和测试工具&#xff0c;可以大大缩短产品研发周期、降低研发成本和提高产品质量。本文将从汽车虚拟仿真技术的实现过程、应用…

Sora:云端启航

2024年2月16日&#xff0c;OpenAI发布了“文生视频”&#xff08;text-to-video&#xff09;的大模型工具&#xff0c;Sora&#xff08;利用自然语言描述&#xff0c;生成视频&#xff09;。王炸消息一出&#xff0c;全球都再次被OpenAI震撼了。AI视频的高度一下子被Sora拉高了…

【论文阅读】《Graph Neural Prompting with Large Language Models》

文章目录 0、基本信息1、研究动机2、创新点3、准备3.1、知识图谱3.2、多项选择问答3.3、提示词工程&#xff08;prompt engineering&#xff09; 4、具体实现4.1、提示LLMs用于问答4.2、子图检索4.3、Graph Neural Prompting4.3.1、GNN Encoder4.3.2、Cross-modality Pooling4.…

《无线网络技术》考试版笔记

第一章 无线网络介绍 什么是多径效应&#xff0c;如何去克服&#xff1a; 在发射机和接收机之间没有明显的直线路径时&#xff0c;就会产生多径传播。如果两个信号彼此叠加&#xff0c;那么接收设备就无法正确解调信号&#xff0c;无法还原为它的原始数据形式。 可以稍微调整接…

Android修行手册-Chaquopy中opencv、numpy的初步应用

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

Zookeeper3:客户端命令

文章目录 客户端命令连接服务端Zookeeper客户端内置命令 ls - 节点信息 客户端命令 连接服务端Zookeeper //客户端连接服务端zookeeper 默认连的本机2181端口的zookeeper cd /opt/module/zookeeper-3.9.1/bin && sh zkCli.sh//客户端连接远程服务端zookeeper cd /op…

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…

蓝桥杯Java B组历年真题(2013年-2019年)

一、2013年真题 1、世纪末的星期 使用日期类判断就行&#xff0c;这里使用LocalDate&#xff0c;也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…

day07_分类管理EasyExcel品牌管理

文章目录 1 分类管理1.1 菜单添加1.2 表结构介绍1.3 页面制作1.4 列表查询1.4.1 需求分析1.4.2 后端接口CategoryCategoryControllerCategoryServiceCategoryMapperCategoryMapper.xml 1.4.3 前端对接category.jscategory.vue 2 EasyExcel2.1 数据导入导出意义2.2 EasyExcel简介…

Vue3速成

文章目录 day 11. 创建vue3工程3. 响应式数据4. 计算属性 day 25. watch 监视6. watchEffect7. 标签的ref属性8. 回顾TS中的接口_泛型_自定义类型 day 1 1. 创建vue3工程 相关代码如下&#xff1a; ## 创建vue工程 npm create vuelastest## 安装node_modules npm install //…

nginx出现 “414 request-uri too large”

nginx出现 “414 request-uri too large” 1.修改传参方式 POST 2.字段能变成后端获取就自己获取&#xff0c;不用前端传 3.修改nginx配置&#xff0c;添加client_header_buffer_size 512k;large_client_header_buffers 4 512k;配置

【LeetCode】876_链表的中间结点_C

题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 示例 提示&#xff1a; 链表的结点数范围是 [1, 100]1 <…