【剑指Offer】面试题8:旋转数组的最小数字

基于LSTM语义分析的企业风险预测系统 数字化时代,企业面临着前所未有的挑战和机遇,而风险管理作为确保企业稳定发展的关键一环,其重要性日益凸显。为了及时、准确地监测和分析企业相关的风险,并预测可能带来的风险,本文介绍了一种基于长短期记忆(LSTM)语义分析的企业风险预测系统。该系统利用深度学习技术,通过将收集到的企业数据进行预处理和分析,结合LSTM模型对文本进行深度语义分析,从而实现对潜在风险的预测和评估。系统设计方面,该系统包括数据预处理、LSTM模型构建与训练、风险预测以及可视化展示等模块。 阅读详情

一:题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

二:解题思路

非递减排列  :数字按照增加的顺序排列,其中有相等的数
 如:

1,2,3,4,5,.:递增排列 

9,8,7,6,5.:递减排列

1,2,3,3,4,5,8,8,.:非递减排列

 9,8,7,7,6,5,5,2,1,.:非递增排列


题目中把排序数组的前面n个元素搬到最后面,可能n=0,要注意

第一个简单的想法:

旋转后的数组实际上可以划分为两个排序数组,而且前面的子数组的元素都大于等于后面子数组的元素,而最小元素刚好是这两个子数组的分界线

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
                if(rotateArray.size()==0)
            return 0;
        if(rotateArray.size()==1)
            return rotateArray[0];
        
        int length=rotateArray.size();
        int i;
        for(i=0;i<=length-2;i++)
            if(rotateArray[i]>rotateArray[i+1])
                return rotateArray[i+1];
        //如果数组转换后,是一个非递减排序,第一位是最小的
        return rotateArray[0];
    }
};

时不要把题看的太简单,往往都是出题者的坑,套路,就算实现了,可能也不是最佳情况,剑指Offer给出的最佳结果是基于排序的思想

用两个指针分别指向两个子数组,第一个指针总是指向前面递增数组的元素,第二个指针总是指向后面递增的数组的元素,最终第一个指针指向前面子数组的最后一个元素,第二个指针指向后面数组的第一个元素,他们最终指向两个相邻的元素,而第二个指针刚好指向最小的元素。


特殊情况

当第一个指针,中间位置,与第二个指针所指元素相同的时候怎么办呢?采用顺序查找

三:代码实现

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size()==0)
            return 0;
        if(rotateArray.size()==1)
            return rotateArray[0];
        
        int index1=0;
        int index2=rotateArray.size()-1;
        int midIndex=index1;
        
        while(rotateArray[index1]>=rotateArray[index2]){
            if(index2-index1==1){
                midIndex=index2;
                return rotateArray[midIndex];
            }
            
            midIndex=(index1+index2)/2;
            
            //三者相等
            if(rotateArray[index1]==rotateArray[midIndex] && rotateArray[midIndex]==rotateArray[index2])
                return MinInOrder(rotateArray,index1,index2);
            if(rotateArray[index1]<=rotateArray[midIndex])
                index1=midIndex;
            else if(rotateArray[index2]>=rotateArray[midIndex])
                index2=midIndex;

        }
        return rotateArray[midIndex];
    }
    
    int MinInOrder(vector<int> rotateArray,int index1,int index2){
        int result=rotateArray[index1];
        int i=index1+1;
        for(i;i<=index2;i++)
            if(result>rotateArray[i])
                result=rotateArray[i];
        return result;
    }
};


用LT1166+MOS管打造实验室级恒流源:闭环反馈与推挽驱动的深度调优 本文详细介绍了基于LT1166电流模式控制器与MOS管推挽架构的实验室级恒流源设计方法。通过闭环反馈调优和动态响应优化,实现带宽达100kHz、纹波低于0.1%的高性能恒流输出,适用于精密仪器校准和半导体测试等场景。重点解析了系统架构设计、MOS管选型策略以及频率响应测试等关键技术要点。 阅读详情

相关推荐

C++版 - 剑指offer 面试题8旋转数组最小数字

面试题8旋转数组最小数字 目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个排好序的数组的一个旋转,输出旋转数组最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组最小值为1。(要求时间复杂度O(n).) 提交网址: http://www.nowcoder.com/practice/9f3231a9

极客学长Bravo | 突破信息差 | 副业生财有术 1492

剑指offer-面试题8

1. 基本知识复习 对于二叉树中寻找下一节点是一个重要知识点,首先以中序排序寻找为例,如图: 在上图中中序遍历序列为{d,b,h,e,i,a,f,c,g}。 现在分为两大种情况: 1.该节点有右孩子,则下一节点为他右子树的中序遍历的第一个值(例如b的下一节点为h) 2.该节点没有右孩子,则需要去找其父亲节点(反正结果一定是一个父节点或则null) 2.1 如果该节点是父亲节点的左孩子,那么下一...

xiaofei的博客 377

椰子石器时代服务端V3.0源码(高清修复版本)

石器时代gmsv端支持Linux6.x系统,win系统运行需要虚拟机中跑,一起提供配置好的vm,源码已经测试完整,可以完美运行,仅供研究学习使用。此版本是高清重置版本,看着舒服,支持WIN10 WIN11系统。可以下载下载,单机玩,局域网里面玩,也可以开服使用。lua是开源的,任务脚本丰富。平常一起和小伙伴们当当GM,回忆一下当年的乐趣。

剑指Offer —— 面试题(八)

注解仅仅是元数据,本身不包括任何的业务逻辑,一个注解对应着一个消费者,在合适的时机翻译注解对应的逻辑,一般是结合反射技术实现。自定义注解定义为@interface,继承java.lang.Annotation接口。...

想要进大厂的螺丝钉的博客 254

剑指offer 面试题8:二叉树的下一个节点【C++版本】

目总结与代码归档: 【剑指offer-2】目目录【C++版本】 GitHub代码路径: GitHub 面试题8 二叉树的下一个节点 目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。树节点定义如下: struct BinaryTreeNode { int ...

墨1024 345

笔记《剑指offer》-第八 JumpFloor 跳台阶

目描述: 目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。 求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 思路: 在n>2的时候, 如果最后一次跳一步,有 f(n-1) 种可能,如果最后一次跳两步,有f(n-2)种可能 所以总的情况应该是起两种情况的总和,也就是f(n) = f(n-1) + f(n-2); 并且有f(1) = 1, f(2) = 2; ...

liumihan的博客 364

剑指offer面试题8旋转数组最小数字

目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,则该旋转数组最小值为1. 代码:(版本1.0 这个程序还没有分析到位) //这里的做法类似于二分查找,设置两个索引start ,end,分别指向数组首元素和末尾的元素,设置索引mid=(star...

810364804 272

【重点】【二分搜索】剑指offer——面试题8旋转数组最小数字

剑指offer——面试题8旋转数组最小数字 Solution1:自己想出来的弱智方法。。 class Solution { public: int minNumberInRotateArray(vector&amp;amp;lt;int&amp;amp;gt; rotateArray) { int n=rotateArray.size(); if(n&amp;amp;lt;=1) return n...

Allenlzcoder的博客 313

剑指offer面试题8旋转数组最小数字

目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个非递减序列的一个旋转,输出旋转数组最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小值为1。思路:直接从头到尾遍历数组一次,即可public int minNumberInRotateArray(int [] array) { if(array==null||ar

sushauai的博客 466

剑指offer面试题8:旋转数组最小数字

目:把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。例如数组{3, 4, 5, 1, 2}为{l ,2, 3, 4, 5}的一个旋转,该数组最小值为1 思路:想利用旋转数组的局部有序性进行二分查找数组最小值。 具体思路: 1、用两个指针分别指向数组的第一个元素和最后一个元素,根据意,第一个元素应该是大于等于最后一个...

GuYuyuyuyu的博客 247

【一刷《剑指Offer》】面试题 8旋转数组最小数字

力扣对应目链接:154. 寻找旋转排序数组中的最小值 II - 力扣(LeetCode)牛客对应目链接: 旋转数组最小数字_牛客霸_牛客网 (nowcoder.com)这里贴出 AC 代码:(可以看看两体之间的区别)

Elena's Blog 1010

[剑指offer]面试题8旋转数组最小数字

面试题8旋转数组最小数字 目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小值为1。 在数组{3,4,5,1,2}中查找最小值的过程: #include <iostream> using namespace std; int Min(int *numbers, int length) { if (numbers == nullpt

m0_51955470的博客 298

剑指Offer面试题8旋转数组最小数字

剑指Offer》 P66面试题8旋转数组最小数字目:

(●—●) 664

剑指offer面试题8旋转数组最小数字

目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小值为1。 九度 : http://ac.jobdu.com/problem.php?pid=1386 不知道为什么一直超时。 package com.

执子之手 534

[剑指offer]面试题 8旋转数组最小数字

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]。已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。它原来是一个升序排列的数组,并按上述情形进行了多次旋转。若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]给你一个可能存在 重复 元素值的数组 nums

weixin_40954354的博客 165

剑指Offer学习】【面试题8 : 旋转数组最小数字

目: 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组最小元素。例如数组{3,4, 5, 1, 2 }为{ l1,2,3, 4,5}的一个旋转,该数组最小值为1

https://github.com/Wang-Jun-Chao 8540

剑指offer面试题8旋转数组中的最小数字

//旋转数组中的最小数字 //目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转,输入一个递增排序的数组数组旋转数组最小元素。 //遍历数组一次,找出最小,效率为O(n),显然不是我们想要的结果 //旋转数组特性:1.可能为两个递增的数组,找出较小数组中的开头的那个就是要求输入的元素 //2.既然为排序好的,那我们可不可以尝试一下二分法去查找呢#include<iostrea

Steve_Abelieve 563

剑指offer-面试题8旋转数组中的最小数字

目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小元素为1.解public int Min(int[] nums){ if(nums.length==1){//只有一个元素 return nums[0];

Decorator2015的博客 515

剑指Offer系列-面试题8旋转数组最小数字

目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组旋转。输入一个递增排序的数组的一个旋转,输出旋转数组最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组最小值为1. 思考:最小值只有一个,只需要把数组遍历一遍就可以知道最小值,但是这种方法的复杂度为O(1),没有利用旋转数组的特性,达不到面试官的要求。旋转数组实际上可以划分为两个排序的子数组,而

RojerAlone的博客 401
上一篇: 【剑指Offer】面试题3:二维数组中的查找
下一篇: 【剑指Offer】面试题10:二进制中1的个数
曦曦慕慕
博客等级 码龄13年 8粉丝 79原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值