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

题目描述:

在这里插入图片描述

示例:

在这里插入图片描述

方法一:

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

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.empty()) return 0;
        for(int i = 1;i<rotateArray.size();i++)
        {
            if(rotateArray[i] < rotateArray[i-1]) return rotateArray[i];
        }
        return rotateArray[0];
    }
};

C

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    if(rotateArrayLen == 0) return 0;
    for(int i = 1;i<rotateArrayLen;i++)
        if(rotateArray[i] < rotateArray[i-1]) return rotateArray[i];
    return rotateArray[0];
}

方法二:

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

class Solution {
public:
	int minNumberInRotateArray(vector<int> 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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值