NO6、旋转数组

2024-01-21 02:58
文章标签 数组 旋转 no6

本文主要是介绍NO6、旋转数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

6、旋转数组

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

示例1
输入

[3,4,5,1,2]

返回值

1
1、常规做法
 int minNumberInRotateArray(vector<int> rotateArray) {if (rotateArray.size() == 0) return 0;int minNum = rotateArray[0], len = rotateArray.size();for (int i = 1; i < len; ++i) {if (rotateArray[i] < minNum) return rotateArray[i];}return minNum;}
    int minNumberInRotateArray(vector<int> rotateArray) {if (rotateArray.size() == 0) return 0;int  len = rotateArray.size();for (int i = 0; i < len-1; ++i) {if (rotateArray[i] > rotateArray[i+1]) return rotateArray[i+1];}return rotateArray[0];}
2、二分法 很不错
int minNumberInRotateArray(vector<int> rotateArray) {if (rotateArray.size() == 0) return 0;int low = 0, high = rotateArray.size() - 1;while (low + 1 < high) {int mid = low + (high - low) / 2;if (rotateArray[mid] < rotateArray[high]) high = mid;else if (rotateArray[mid] == rotateArray[high]) high = high-1;else {low = mid;}}return min(rotateArray[low], rotateArray[high]);
}
二刷:
2-1常规做法

运行时间:26ms 占用内存:1124k

    int minNumberInRotateArray(vector<int> rotateArray) {if( rotateArray.size() == 0) return 0;if( rotateArray.size() == 1) return rotateArray[0];for(int i = 0; i < rotateArray.size()-1; ++i){if( rotateArray[i] > rotateArray[i + 1] ) return rotateArray[i+1];}return rotateArray[0];//走到这一步了,就说明整个数组都是递增或者都是非递减的}
2-2、二分法变种
    int minNumberInRotateArray(vector<int> rotateArray) {       if( rotateArray.size() == 0) return 0;int low = 0, high = rotateArray.size()-1;while(low + 1 < high){int mid = low + (high - low)/2;if(rotateArray[mid] < rotateArray[high]) high = mid;//说明右边有序,那就向左边走else if(rotateArray[mid] == rotateArray[high]) high = high-1;// 这种情况跟是特例只能一个一个的判断elselow = mid;}return min(rotateArray[low], rotateArray[high]);}

美女帅哥们如果觉得写的还行,有点用的话麻烦点个赞或者留个言支持一下阿秀~
如果觉得狗屁不通,直接留言开喷就完事了。

需要该笔记PDF版本的去个人公众号【拓跋阿秀】下回复“阿秀剑指offer笔记”即可。

这篇关于NO6、旋转数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628164

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[

Go 数组赋值问题

package mainimport "fmt"type Student struct {Name stringAge int}func main() {data := make(map[string]*Student)list := []Student{{Name:"a",Age:1},{Name:"b",Age:2},{Name:"c",Age:3},}// 错误 都指向了最后一个v// a