旋转数组的最小值

news2025/2/26 9:57:55

文章目录

  • 1 题目
  • 2 思路
    • 2.1 思路1
    • 2.2 思路2
  • 3 实现
    • 3.1 暴力
    • 3.2 二分查找

1 题目

将一个数组最开始的若干元素搬到数组的末尾,称之为数组的旋转。输入一个已排好序数组的一个旋转,求该旋转数组的最小元素。如,数组{3,4,,5,1,2}为有序数组{1,2,3,4,5}的一个旋转数组,该数组的最小值为1。

2 思路

2.1 思路1

暴力遍历数组,求出数组的最小元素。

时间复杂度:O(n)
空间复杂度:O(1)

2.2 思路2

将旋转后的数组看成两个升序的子序列,即查找一个元素(使用二分查找法),满足的条件为比相邻左边的元素小,也比相邻右边的元素小(如果存在的话)。

算法1详细(方便理解):

  • 用l指针指向第一个序列的第一个元素,用r指针指向第二个序列的最后一个元素;
    • 当l = mid时,r为最小元素(特殊处理当最小元素位于末尾的情况),例如{2,3,4,5,1},此时最小元素为r指向的元素,而不是mid指向的元素;
    • 当元素满足比左边元素小,比右边元素小时,即为最小元素;
    • 如果中间指针mid((l+r)/2)在第一个序列中(即A[mid] < A[l]),则要寻找的元素在后半段中,把l改为mid;
    • 如果中间指针mid第二个序列中(即A[mid]<A[r]),则要寻找的元素在前半中;
  • 当l=r时,返回最小元素A[r];否则,返回最小元素A[mid]。

算法2详细(上一种算法的改进版本):

  • 用l指针指向第一个序列的第一个元素,用r指针指向第二个序列的最后一个元素;
    • 如果中间指针mid((l+r)/2)在第一个序列中(即A[mid] < A[l]),则要寻找的元素在后半段中,把l改为mid;
    • 如果中间指针mid第二个序列中(即A[mid]<A[r]),则要寻找的元素在前半中。
  • 当l和r相邻时(此时mid=l),最小元素在r指向的元素。

时间复杂度:O(logn)
空间复杂度:O(1)

在这里插入图片描述

例如:原数组{1,2,3,4,5},
旋转后的数组{2,3,4,5,1},1比左边的5小,无右边的元素;
旋转后的数组{3,4,5,1,2},1比左边的5小,比右边2小;
旋转后的数组{4,5,1,2,3},1比左边的5小,比右边2小。

3 实现

3.1 暴力

#include<cstdio>

int solution(int *A, int n){
    int ans = A[0];
    for(int i = 1;i < n;i++)
        if(A[i] < ans) ans = A[i];
    return ans;
}

int main(){
    
    int A[] = {2,3,4,5,1};
    //int A[] = {3,4,5,1,2};
    //int A[] = {4,5,1,2,3};
    //int A[] = {5,1,2,3,4};
    
    printf("%d", solution(A, sizeof(A)/sizeof(A[0])));
    return 0;
}

3.2 二分查找

#include<cstdio>

int solution(int *A, int n){
    int l = 0, r = n - 1, mid;
    while(l <= r){
        mid = (l + r)/2;
        printf("值   %d %d %d \n", A[l], A[mid], A[r]);
        printf("序号 %d %d %d \n", l, mid, r);
        
        //特殊处理最小元素位于最后一个的情况,例如2,3,4,5,1的情况,此时mid=l=3,r=4
        if(l == mid && A[r] < A[mid]) break;
        
        //如果比左边相邻的元素小
        //同时也比右边相邻的元素小(如果右边元素不存在,则和自己比较)
        if((A[mid] < A[mid-1] && A[mid] <= A[mid+1])
        ) break;
        
        if(A[mid] < A[r]) r = mid;
        else l = mid;
    }
    return (l == mid)?A[mid+1]:A[mid];
}

int solution2(int *A, int n){
    int l = 0, r = n - 1, mid;
    while(A[l] >= A[r]){
        if(r -l ==1){
            mid = r;
            break;
        }
        mid = (l + r)/2;
        printf("值   %d %d %d \n", A[l], A[mid], A[r]);
        printf("序号 %d %d %d \n", l, mid, r);
        
        if(A[mid] < A[r]) r = mid;
        else l = mid;
    }
    return A[mid];
}

int main(){
    
    int A[] = {2,3,4,5,1};
    //int A[] = {3,4,5,1,2};
    //int A[] = {4,5,1,2,3};
    //int A[] = {5,1,2,3,4};
    
    printf("%d", solution(A, sizeof(A)/sizeof(A[0])));
    return 0;
}

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

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

相关文章

linux文件存储之inode,硬链接,软链接详解

1.什么是inode 首先linux一切皆文件&#xff0c;一切皆文本流 inode &#xff0c;中文译名“索引节点”&#xff0c;也叫“i节点” 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做”扇区”&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&a…

基于Java的校园餐厅订餐管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

塔望3W消费战略全案丨轻食植物基,突围侧翼战

植鲜生 客户&#xff1a;民强&#xff08;昆山&#xff09;食品科技有限公司 品牌&#xff1a;植鲜生 时间&#xff1a;2021年起 项目部分内容保密期 突破传统植物基禁锢 破局轻食新赛道 民强&#xff08;昆山&#xff09;食品科技有限公司是一家集研发、生产、销售为一体…

详细讲解MySQL中的数据类型

详细讲解MySQL中的数据类型 一&#xff0c;整数类型 MySQL中常用的整数类型包括&#xff1a; TINYINT&#xff1a;占用1字节&#xff0c;表示范围为-128到127的有符号整数或0到255的无符号整数。 SMALLINT&#xff1a;占用2字节&#xff0c;表示范围为-32768到32767的有符号整…

众佰诚:开抖音小店需要交保证金吗

随着互联网的发展&#xff0c;越来越多的人选择通过开设网店来创业。抖音作为一款短视频平台&#xff0c;也提供了开店的功能。那么&#xff0c;开抖音小店需要交保证金吗?这是许多创业者关心的问题。 首先&#xff0c;我们需要明确的是&#xff0c;开设抖音小店是需要交纳保证…

【TensorFlow1.X】系列学习笔记【入门四】

【TensorFlow1.X】系列学习笔记【入门四】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 【TensorFlow1.X】系列学习文章目录 文章目录 【TensorFlow1.X】系列学习笔记【入门四】前言损失函数作用均方误差(MSE)交叉熵(C…

智能医疗:互联网医院开发的挑战与机会

随着技术的不断进步&#xff0c;互联网医院的发展为医疗保健带来了巨大的机遇&#xff0c;但同时也带来了一系列挑战。本文将探讨互联网医院开发中的一些关键挑战和机会&#xff0c;以及如何应对这些挑战。 挑战一&#xff1a;数据隐私和安全性 在互联网医院开发中&#xff…

Kubernetes技术与架构-网络 2

Kubernetes集群支持IP地址以及DNS访问Pod或者Service。 Service域名解析 Service域名解析包括A/AAAA记录以及SRV记录 A/AAAA记录 域名&#xff1a;my-svc.my-namespace.svc.cluster-domain.example 该域名对应的service名称是my-svc、service的命名空间是my-namespace、servic…

Qt之自定义model读写CSV文件

一.效果 本文基于QAbstractTableModel实现了一个支持读写CSV文件的TableModel。CSV数据格式虽然很简单,但是网上大多数读写方式其实都是有bug的,没考虑到字段里包含逗号或换行符这种复杂数据的情况。 二.原理 CSV(Comma-Separated Values)文件是一种简单类型的纯文本文件…

GoLong的学习之路(三)语法之运算符

书接上回&#xff0c;我们进展到了GoLong的基本数据类型&#xff0c;接下来说运算符&#xff08;其实和常见的编程语言的逻辑规则一样&#xff09; 运算符 运算符用于在程序运行时执行数学或逻辑运算。&#xff08;不可谓不重要&#xff09; Go 语言内置的运算符有&#xff…

python基础语法(4)

基础语法 前言文件文件是什么文件路径文件操作1.打开文件2. 关闭文件3.写文件4. 读文件5.上下文管理器 库使用库标准库第三方库 前言 本文基于pycharm编译器&#xff0c;也可以使用Anaconda 里的编译器&#xff0c;将讲解一些python的一些基础语法知识&#xff0c;是对上篇文章…

element-ui的日历组件el-calendar高度咋调小

最近项目首页有个空余 不知道放啥 打算放个日历card 充充位置&#xff0c; el-calendar日历组件的整体宽度可以用el-row el-col :gutter :span来控制自适应 但是官网文档没说高度咋缩小 细长一条好难看 自己尝试改了改element的样式没整出来 最后照着这位博主的方法改是好使滴…

STM32 HAL库串口使用printf

STM32 HAL库串口使用printf 背景配置说明在usart.h中添加在usart.c中添加在工程中选中微库&#xff1a; 测试 背景 在我们使用CubeMX生成好STM32 HAL库工程之后&#xff0c;我们想使用printf函数来打印一些信息&#xff0c;配置如下&#xff1a; 配置说明 在usart.h中添加 …

postgresql|数据库迁移|ora2pg工具的web界面介绍

前言&#xff1a; ora2pg是一个比较强大的数据库迁移工具&#xff0c;那根据名字来说&#xff0c;也可以看出来&#xff0c;这个工具主要是用来配置去O化&#xff0c;将在运行的oracle数据库迁移到postgresql数据库内的 当然了&#xff0c;我们使用此工具主要还是用命令行&am…

WeTab谷歌浏览器的AI助手,附WeTab下载地址

点击进入WeTab新标签页的&#xff0c;获取WeTab https://microsoftedge.microsoft.com/addons/detail/wetabai%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/bpelnogcookhocnaokfpoeinibimbeff?utm_sourceSteamDB 注&#xff1a;可能谷歌浏览器打开get按钮是灰色的&#xff0c;那就换…

Unity Hub报错:No valid Unity Editor license found. Please activate your license.

最近 遇到一个问题&#xff0c;打开高版本时Hub抛出异常&#xff1a;No valid Unity Editor license found. Please activate your license. 首先你必须排除是否登录Unity Hub&#xff0c;并且激活许可证。 方法一&#xff1a;禁用网络&#xff08;这个可能无效&#xff09; …

算法进阶——数组中的逆序对

题目 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007 数据范围&#xff1a;对于 50% 的数据, size≤104 对…

Linux系统CH347应用—SPI功能

Linux/安卓系统使用CH347转接SPI功能有三种应用方式&#xff1a; 1. 使用CH34X_MPHSI_Master总线驱动为系统扩展原生SPI Master&#xff0c;此方式无需进行单独的应用层编程&#xff1b; 2. 使用CH341PAR_LINUX字符设备驱动&#xff0c;此方式需要配合使用厂商提供的库文件&a…

js创建 ajax 过程

目录 前言&#xff1a;AJAX 技术的重要性 详解&#xff1a;创建 AJAX 请求的步骤 1. 创建 XMLHttpRequest 对象 2. 配置请求 3. 处理响应 4. 发送请求 5. 处理异步请求 解析&#xff1a;AJAX 请求的重要性和限制 总结&#xff1a; 前言&#xff1a;AJAX 技术的重要性 …

2019年亚太杯APMCM数学建模大赛B题区域经济活力及其影响因素的分析与决策求解全过程文档及程序

2019年亚太杯APMCM数学建模大赛 B题 区域经济活力及其影响因素的分析与决策 原题再现 区域&#xff08;或城市或省级&#xff09;经济活力是区域综合竞争力的重要组成部分。近年来&#xff0c;为了提高经济活力&#xff0c;一些地区推出了许多刺激经济活力的优惠政策&#xf…