c++_leetcode_寻找峰值

目录

一、寻找峰值的示例

二、官方实现代码及解释

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.mzph.cn/news/712418.shtml

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

相关文章

【JavaScript】面试手撕节流

引入 上篇我们讲了防抖&#xff0c;这篇我们就谈谈防抖的好兄弟 – 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。 PS: 开源节流中节流与这个技术上的节流&#xff0c;个人认为本质上是一样的。 开源节流的节流指的是节省公司的金钱开支。前端技术上的…

databinding双向绑定原理,Android程序员最新职业规划

1. Android架构设计模式 MVC架构设计模式&#xff1a;MVC全名是Model View Controller&#xff0c;是模型(model)-视图(view)-控制器(controller)的缩写。MVP架构设计模式&#xff1a;MVC全名是Model View Persenter&#xff0c;MVP由MVC演变而来&#xff0c;是现在主流的开发…

小工具——抖音短视频评论自动同步

很多时候喜欢看抖音的评论&#xff0c;有时候评论也是一个查疑解惑的好地方&#xff0c;很多人也喜欢把抖音的评论集中起来做分析。 因为一个朋友问过我这回事&#xff0c;闲着的时候也研究了下抖音&#xff0c;所以自己做了个小工具&#xff0c;自动同步你观看的抖音短视频的…

Gophish+EwoMail 自建钓鱼服务器

GophishEwoMail 自建钓鱼服务器 文章目录 GophishEwoMail 自建钓鱼服务器1.前提准备2.搭建EwoMail邮件服务器1&#xff09;Centos7 防火墙操作2&#xff09;设置主机名3&#xff09;host配置4&#xff09;安装EwoMail5&#xff09;获取DKIM6&#xff09;端口服务介绍7&#xff…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

Maven-私服(黑马学习笔记)

前面我们在讲解多模块开发的时候&#xff0c;我们讲到我们所拆分的模块是可以在同一个公司各个项目组之间进行资源共享的。这个模块的资源共享&#xff0c;就需要通过我们接下来所讲解的Maven的私服来实现。 首先我们先介绍一下什么是私服&#xff0c;以及它的作用是什么。再来…

力扣180 连续出现的数字

如何有效地识别在数据库中至少连续出现三次的数字&#xff1f; 目录 题目描述 解题思路 完整代码 进一步探索 题目描述 表&#xff1a;Logs ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varch…

2024最新EasyRecovery磁盘数据恢复软件功能全面介绍

一、软件概述 EasyRecovery磁盘数据恢复软件是一款专业的数据恢复工具&#xff0c;旨在帮助用户从各种存储设备中恢复因各种原因丢失的数据。该软件凭借其强大的恢复能力、操作简便和高效稳定的性能&#xff0c;得到了广大用户的认可。 EasyRecovery-mac最新版本下载:https://…

Fabric V2.5 通用溯源系统——应用后端GIN框架部分设计

本节对Fabric V2.5 通用溯源系统的应用后端部分做一个简单的介绍,包括目录结构、文件作用、用户注册登录与农产品信息上链过程介绍。此节内容免费发布在TrueTechLabs Fabric学习交流QQ群。 购买专栏前请认真阅读:《Fabric项目学习笔记》专栏介绍 TrueTechLabs Fabric学习交流…

transformer--编码器1(掩码张量、注意力机制、多头注意力机制)

编码器部分: 由N个编码器层堆叠而成每个编码器层由两个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接。第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接 掩码张量 什么是掩码张量 掩代表遮掩&#xff0c;码…

Ansible的playbook的编写和解析

目录 什么是playbook Ansible 的脚本 --- playbook 剧本 实例部署&#xff08;使用playbook安装启动httpd服务&#xff09; 1.编写一个.yaml文件 在主机下载安装http&#xff0c;将配置文件复制到opt目录下 运行playbook 在192.168.17.77主机上查看httpd服务是否成功开启…

DolphinScheduler——蔚来汽车数据治理开发平台的应用改造

目录 一、业务痛点 二、应用现状 三、技术改造 3.1 稳定性 3.1.1 滚动重启黑名单机制精准路由 3.2 易用性 依赖节点优化 补数任务优化 多 SQL 执行 原文大佬的这篇基于调度系统的数据治理案例有借鉴意义&#xff0c;这里摘抄下来用作学习和知识沉淀。 一、业务痛点 蔚…

Dell R730 2U服务器实践2:VMWare ESXi安装

缘起 刚到手边的一台Dell R730是三块硬盘raid0 &#xff0c;把我惊出一身冷汗&#xff0c;准备把它们改组成raid1 或者raid5 。 但是舍不得里面的ESXi 8 &#xff0c;寻找能否把raid0改成raid1 还不掉WSXi的方法&#xff0c;很遗憾没有找到。那样只能重装ESXi了。 ESXi软件下…

基于串流技术的p2p共享桌面共享方案

研究远控有一定时间了&#xff0c;但真正落地运用的不多&#xff0c;所以也不太上心&#xff0c;平时也只是自己diy玩玩&#xff0c;远程共享看看电视剧。 最近生成式ai大火&#xff0c;直接带动了gpu应用的相关场景&#xff0c;相关场景&#xff0c;但gpu卡又贵&#xff0c;对…

每日一题——LeetCode1556.千位分隔符

方法一 个人方法&#xff1a; 把n转为字符串&#xff0c;逆序遍历n&#xff0c;把n的每个元素加入res&#xff0c;每三次加入.&#xff0c;最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史&#xff0c;生活更美好&#xff0c;趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史&#xff1a;经济…

Typora快捷键设置详细教程(内附每个步骤详细截图)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

存储过程基本了解

文章目录 介绍存储过程示例1. 目的2. 输入参数3. 输出参数4. 执行逻辑5. 返回值6. 示例用法7. 注意事项 存储过程的关键字有哪些简单实操 介绍 存储过程是一组预编译的SQL语句&#xff0c;以及流程控制语句&#xff0c;封装在数据库服务器中并可以被重复调用。它们可以接收参数…

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N&#xff0c;接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相…