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.hqwc.cn/news/503728.html

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

相关文章

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

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

实战分享:Tomcat打破双亲委派模型,实现Web应用独立与安全隔离的奥秘

目录 一、JVM 类加载机制 二、Tomcat 类加载器 2.2 findClass 介绍 3.2 loadClass 介绍 三、web应用隔离 3.1 Spring 加载问题 在开始文章内容之前&#xff0c;先来看三个问题 假如在 Tomcat 上运行了两个 Web 应用程序&#xff0c;两个 web 应用中有同名的Servlet&#xf…

腾讯云「2024新春采购节」满额返券,最高返5000元代金券

满额返券 在新春采购节活动上消费满满1万元可返500元代金券、满3万元可返1500元代金券、满6万元可返3000元代金券、满10万元可返5000元代金券&#xff0c;如下图&#xff1a; 腾讯云满额返券 以上是腾讯云百科分享的腾讯云2024年新春采购节优惠活动&#xff0c;更多云服务器详…

Redis的主从搭建

1.准备两台机器&#xff0c;安装好redis 2.修改从服务器的redis配置 slaveof <masterip> <masterport>两个参数 masterip 主的ip 主的端口号 masterport 3. 启动redis 1.先启动主机redis 2.再启用从机redis 主机redis日志打印 从机redis 日志打印

HTML教程(3)——常用标签(1)

一、图片标签 1.场景&#xff1a;在网页中显示图片 2.基本写法&#xff1a; <img src""> 3.特点&#xff1a;单标签&#xff0c;img标签需要展示对应的效果&#xff0c;需要借助其属性进行设置 4常用属性&#xff1a; src&#xff1a;其属性值为目标图片…

Linux系统编程7--线程 写个测试脚本

Linux系统编程7–线程_写个测试脚本 参考博客&#xff1a; Linux多线程编程初探 - 峰子_仰望阳光 - 博客园 (cnblogs.com) 我的PC是8核*16进程&#xff0c;所以在固定的时间点&#xff0c;我可以同时运行8 * 16的进程&#xff0c;更多的线程&#xff08;任务管理器&#xff09;…

大数据和机器学习在气象预报中的应用-张平文院士

报告链接&#xff1a;张平文院士 -- 大数据和机器学习在气象预报中的应用_哔哩哔哩_bilibili

MATLAB R2022b 安装教程

MATLAB R2022b 安装教程 MathWorks 于2022年9月发布了 MATLAB 和 Simulink 产品系列的最新版本 Matlab R2022b版本 &#xff0c;加入两个新产品&#xff1a; Medical Imaging Toolbox — 可视化、配准、分割和标注二维及三维医学图像Simscape Battery — 设计和仿真电池和储能系…

ceph性能测试

查看集群状态 ceph -s查看osd情况 ceph osd tree创建pg_num为60的pool&#xff0c;名为test。 ceph osd pool create test 60rados bench用于测试rados存储池底层性能&#xff0c;该工具可以测试写、顺序读、随机读三种类型 rados bench -p <pool_name> <seconds&…

Linux网络编程——网络基础

Linux网络编程——网络基础 1. 网络结构模式1.1 C/S 结构1.2 B/S 结构 2. MAC 地址3. IP地址3.1 简介3.2 IP 地址编址方式 4. 端口4.1 简介4.2 端口类型 5. 网络模型5.1 OSI 七层参考模型5.2 TCP/IP 四层模型 6. 协议6.1 简介6.2 常见协议6.3 UDP 协议6.4 TCP 协议6.5 IP 协议6…

Linux中的动静态库

目录 一、静态库 &#xff08;1&#xff09;静态库的优缺点&#xff1a; &#xff08;2&#xff09;Linux下静态库的创建和执行 1.直接编译​编辑 2.指定路径和库名 3.用LIBRARY_PATH环境变量来配置路径 二、动态库 &#xff08;1&#xff09;动态库的优缺点 &#xff…

基于JAVA的生鲜超市销售系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 商品档案模块2.2 商品进货模块2.3 商品销售模块2.4 供应商模块2.5 活动管理模块2.6 消息通知模块 三、系统展示四、核心代码4.1 查询商品4.2 商品入库4.3 商品出库4.4 查询商品类型4.5 查询店铺活动 五、免责说明 一、摘…