Leetcode 162.153.33 二分法 C++实现

news2024/11/13 16:11:06

Leetcode 162. 寻找峰值

问题:峰值元素是指其值严格大于左右相邻值的元素。  给你一个整数数组 nums ,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。  你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

算法:二分法解决,如果mid指针所指元素 < 右边元素,则从左边找答案;如果mid指针所指元素 < 右边元素,则从右边找答案。

代码:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = -1,right = nums.size() - 1;
        //优化
        if(nums.size() > 1){//nums数组中元素数量 > 1
            if(nums[0] > nums[1])   return 0;// 最左边的元素是峰值
            else if(nums[right] > nums[right - 1])  return right;// 最右边的元素是峰值
        }
        else    return 0;//nums数组中只有一个元素

        while(left + 1 < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] < nums[mid + 1])  left = mid;//如果mid元素 < 右边元素,就从右边找答案
            else    right = mid;//如果mid元素 >= 右边元素,就从左边找答案
        }
        return right;
    }
};

Leetcode 153. 寻找旋转排序数组中的最小值

问题:已知一个长度为 n 的数组,预先按照升序排列,经由 1 n 次旋转后,得到输入数组。

例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2] 。若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]  。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]

给你一个元素值互不相同的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的最小元素

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

算法:二分法,和上一题类似。

代码:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = -1,right = nums.size() - 1;
        if(right < 1)   return nums[0];//优化
        while(left + 1 < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] < nums[right]) right = mid;// mid < right元素,从左半段找
            else left = mid;// mid > right元素,从右半段找
        }
        return nums[right];
    }
};

Leetcode 33. 搜索旋转排序数组

问题:整数数组 nums 按升序排列,数组中的值互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标从 0 开始计数)。例如,[0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。  

给你旋转后的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1

 你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

算法:二分法,分为两种情况,target x ( 即 nums[mid] )左侧或其他。

下面只讨论 x 在 target 右边,或者等于 target 的情况。其余情况 x 一定在 target 左边。

如果 x>nums[n−1] ,说明 x 在第一段中,那么 target 也必须在第一段中(否则 x 一定在 target 左边)且 x 必须大于等于 target 。写成代码为:

target > end && x >= target

如果 x ≤ nums[n−1],说明 x 在第二段中(或者 nums 只有一段),那么 target 可以在第一段,也可以在第二段。
如果 target 在第一段,那么 x 一定在 target 右边。
如果 target 在第二段,那么 x 必须大于等于 target 
写成代码为:

target > end || x >= target

根据这两种情况,去判断 x 和 target 的位置关系,从而不断地缩小 target 所在位置的范围,二分找到 target 

代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        // target是否在mid的左边
        auto is_left = [&](int i) -> bool{
            int x = nums[i];
            int end = nums.back();
            if(x > end) return target > end && x >= target;// 说明x在第一段中
            return target > end || x >= target;// x在第二段中或者只有一段
        };
        int left = -1,right = nums.size() - 1;
        while(left + 1 < right){// 开空间不为空
            int mid = left + (right - left) / 2;
            if(nums[mid] == target) return mid;//优化,如果mid符合直接return
            if(is_left(mid))    right = mid;// target在mid的左边,在左边找
            else    left = mid;// target不在mid的左边,在右边找
        }
        return nums[right] == target ? right : -1;
    }
};

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

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

相关文章

SpringBoot医疗废物管理系统 项目编号:200082(案例分析)

摘 要 随着医疗废物管理的重要性日益凸显&#xff0c;如何高效管理和处理医疗废物成为医疗机构面临的挑战。该系统涵盖存储间主管、运输员用户、处理地主管和管理员四个角色&#xff0c;旨在实现医废信息管理、出入库记录、运输信息跟踪、处理地信息管理等功能。通过技术手段…

警惕!“On Hold”期刊大变天!又3本被踢出WOS数据库,8月SCI/SSCI期刊目录更新!

【SciencePub学术】本期热点 WOS目录更新 又到了一月一度的科睿唯安官网更新Web of Science核心期刊目录的时候&#xff0c;小编今天带大家一起来看看最新的SCI/SSCI期刊目录有哪些变化吧。 来源&#xff1a;科睿唯安官网 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c…

设计模式(单例模式、工厂模式、建造者模式、代理模式)

设计模式是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案&#xff08;设计思想、设计经验&#xff09;。 一、六大原则 1、单一职责原则&#…

[嵌入式 C 语言] 知识库

一、数据类型 1.1 基本数据类型 自定义类型基础类型占用字节数取值范围描述mls8char1-128 to 1278 位有符号整数mlu8unsigned char10 to 2558 位无符号整数mlvu8volatile unsigned char10 to 2558 位无符号整数&#xff0c;具有 volatile 属性mls16short2-32768 to 3276716 位…

TreeUtils 树工具类

数据展示&#xff1a; 如图&#xff1a;部门树数据 &#xff0c;树形的基础数据 id 、 parentId 、label 便可形成 嵌套对象字段如下&#xff1a;{id: 103, parentId: 101, label: "研发部门", weight: 1} 一、工具类 继承了 hutoo 的工具类 TreeUtil &#xff08…

springboot+Quartz通过数据库控制定时任务执行与时间

前言 在我们的springboot项目中&#xff0c;有很多种实现定时任务的方式 有用最简单的 Scheduled 实现定时任务,即&#xff1a; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component EnableScheduling p…

Arthas相关命令

官方网站&#xff1a;命令列表 | arthas 也可以用idea的插件arthas-idea的插件根据你想定位的代码生成命令 jvm 相关 dashboard - 当前系统的实时数据面板getstatic - 查看类的静态属性heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能jvm - 查看当前 JVM 的信息l…

Studying-刷题补充| 数组:58.区间和、44. 开发商购买土地

目录 58.区间和 44. 开发商购买土地 总结 58.区间和 文档讲解&#xff1a;代码随想录58.区间和 题目&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; (kamacoder.com) 学习&#xff1a;本题最直接的做法是&#xff0c;将数组Array保存好后&#xff0c;通过…

linux - mathematica 安装教程

注意事项&#xff1a; 文件目录不能有空格&#xff0c;不能有中文 安装包 Mathematica - 12.1 安装 解压软件包 7z x Mathematica_12.1.1_LINUX_CN.zip运行安装器 命令运行后解压出Mathematica_12.1.1_LINUX_CN.sh, 运行该安装脚本 chmod x Mathematica_12.1.1_LINUX_CN…

STM32后备区域:读写BKP备份寄存器与使用RTC实时时钟详解

目录 STM32后备区域&#xff1a;读写BKP备份寄存器与使用RTC实时时钟详解 1 什么是STM32的后备区域 分割线* 2.1 BKP备份寄存器简介 2.2 BKP备份寄存器基本结构 2.3 BKP外设头文件 bkp.h介绍 2.4 读写 BKP备份寄存器 操作步骤 2.5 编写 读写备份寄存器 5.1 文件介绍 …

Centos7 系统下安装go语言开发环境

该文章简述在Centos7 amd64 系统中安装go开发环境的方法。 一、golang官网查看对应平台最新的golang版本 Golang 官网地址&#xff1a;All releases - The Go Programming Language 二、 安装GO的过程及相关命令 # 1、下载go&#xff0c;这里使用 go1.22.5 版本&#xff0c;可…

【ACL2024】基于长尾检索知识增强的大语言模型

近日&#xff0c;阿里云人工智能平台PAI与阿里集团安全部内容安全算法团队、华东师范大学何晓丰教授团队合作&#xff0c;在自然语言处理顶级会议ACL2024上发表论文《On the Role of Long-tail Knowledge in Retrieval Augmented Large Language Models》&#xff0c;论文主题为…

爆火游戏《黑神话:悟空》研发背后有哪些故事?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

美团的测试面试题,真的很难吗?

年前&#xff0c;我的一个粉丝留言给我说&#xff0c;他在面试美团的自动化测试岗的时候&#xff0c;不幸挂掉了。 越想越可惜&#xff0c;回想面试经过&#xff0c;好好总结了几个点&#xff0c;发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案 美团的面…

寻访中国100家.NET中大企业 —— 第二站:苏州行

一&#xff1a;事情起因 在.NET圈里混了十多年&#xff0c;相信有不少人知道我专注于玩 .NET高级调试&#xff0c;如今技术上的硬实力还是能够解决市面上的一些疑难杂症&#xff0c;但软实力却在另一个极端&#xff0c;如&#xff08;人际交往&#xff0c;人情事故&#xff09…

[RCTF2015]EasySQL1

打开题目 点进去看看 注册个admin账户&#xff0c;登陆进去 一个个点开看&#xff0c;没发现flag 我们也可以由此得出结论&#xff0c;页面存在二次注入的漏洞&#xff0c;并可以大胆猜测修改密码的源代码 resoponse为invalid string的关键字是被过滤的关键字&#xff0c;Le…

氟化工特氟龙精馏装置:PFA氟化氢反应装置的应用

精馏装置是进行精馏的一种塔式气液接触装置。利用混合物中各组分具有不同的挥发度&#xff0c;即在同一温度下各组分的蒸气压不同这一性质&#xff0c;使液相中的轻组分&#xff08;低沸物&#xff09;转移到气相中。 实验精馏装置的组成 实验精馏装置通常由以下几部分组成&am…

Linux2.6设备驱动开发

一&#xff1a;Linux2.6驱动设备开发的特点 1&#xff1a;首先是属于字符型设备注册的方法之一 这种开发接口是在Linux2.6引入的&#xff0c;之前的版本不支持这种开发方式&#xff0c;也是目前最标准的开发方式。 2&#xff1a;Linux2.6的设备开发 不再去限制设备号&#xf…

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理

目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…

TypeScript学习笔记(二)——TypeScript 高级类型

目录 1. class 类 1.1 class 关键字的基本使用 1.2 类继承 1.3 类成员可见性 1.4 类成员只读修饰符 2. 类型兼容性 2.1 类型兼容性 2.2 接口兼容性 2.3 函数兼容性 3. 交叉类型 4. 泛型 4.1 创建泛型函数 4.2 泛型约束 4.3 多个泛型的类型变量约束 4.4 泛型接口…