栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

牛客网JZ11旋转数组的最小数字(C/C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

牛客网JZ11旋转数组的最小数字(C/C++)

题目描述:

示例:

方法一:

遍历数组,当数组的后一个值比前一个值小的时候,那么后一个值就是所求
遍历完数组如果没有找到,那么这个数组就是单调递增的数组,没有进行转换,直接返回第一个值就可以
C++

class Solution {
public:
    int minNumberInRotateArray(vector rotateArray) {
        if(rotateArray.empty()) return 0;
        for(int i = 1;i 

C

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    if(rotateArrayLen == 0) return 0;
    for(int i = 1;i 
方法二: 

即使这个数组进行旋转,但这个数组还是有序的
可以使用二分法查找
定义第一个left和最后一个right 和中间mid
当left和right相邻时 ,mid = right
mid 取left和right中间的值
当mid = right 或者mid = left时按照方法一进行
否则就变换mid值
当一遍是顺序的,那么就排除这一边,

class Solution {
public:
	int minNumberInRotateArray(vector rotateArray) {
		if (rotateArray.empty()) return 0;
		int left = 0;
		int right = rotateArray.size() - 1;
		int mid = 0;
		while (rotateArray[left] >= rotateArray[right]) {
			if (right - left == 1)
            {
				mid = right;
				break;
			} 
			mid = left + ((right - left) >> 1); 
			if (rotateArray[mid] == rotateArray[left] && rotateArray[left] ==
				rotateArray[right]) {
				int result = rotateArray[left];
				for (int i = left + 1; i < right; i++) {
					if (result > rotateArray[i]) {
						result = rotateArray[i];
					}
				}
				return result;
			} 
			if((rotateArray[mid] >= rotateArray[left]) 
               && (rotateArray[left] >= rotateArray[right]))
				left = mid;
			else right = mid;
		} 
		return rotateArray[mid];
	}
};

相比较于C++代码,我对C的代码进行了一点优化,本质丝毫没有变,
其主体和思路都是一样的,
C

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen)
{
	if (rotateArrayLen == 0) return 0;
	int left = 0;
	int right = rotateArrayLen - 1;
	int mid = 0;
	while (rotateArray[left] >= rotateArray[right]) {
		if (right - left == 1) return rotateArray[right];
		mid = left + ((right - left) >> 1);
		if (rotateArray[mid] == rotateArray[left] && rotateArray[left] ==
			rotateArray[right]) {
			int result = rotateArray[left];
			for (int i = left + 1; i < right; i++)
				if (result > rotateArray[i]) return rotateArray[i];
		}
		if ((rotateArray[mid] >= rotateArray[left])
			&& (rotateArray[left] >= rotateArray[right]))
			left = mid;
		else right = mid;
	}
	return rotateArray[mid];
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/723102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号