牛客网&剑指Offer&旋转数组的最小数

牛客网&剑指Offer&旋转数组的最小数

在这里插入图片描述
代码实现1

class Solution {
public:
    int minNumberInRotateArray(vector rotateArray) {
        int len = rotateArray.size();
        //int len = sizeof(rotateArray)/sizeof(rotateArray[0]);
        if(size == 0)
        {
            return 0;
        }
        sort(rotateArray.begin(), rotateArray.end());
        return rotateArray[0];   
    }
};

代码实现2

#include 
#include 
#include 
#include 
#include 
using namespace std;

class Solution {
public:
	int minNumberInRotateArray(vector rotateArray) {
		int size = rotateArray.size();
		if (size == 0) {
			return 0;
		}
		int left = 0, right = size - 1;
		int mid = 0;

		while (rotateArray[left] >= rotateArray[right]) {
			// 分界点
			if (right - left == 1) {
				mid = right;
				break;
			}
			mid =  (right + left) / 2;
			// rotateArray[left] rotateArray[right] rotateArray[mid]三者相等,无法确定中间元素是属于前面还是后面的递增子数组,只能顺序查找
			if (rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]) 
			{
				return MinOrder(rotateArray, left, right);
			}
			// 中间元素位于前面的递增子数组, 此时最小元素位于中间元素的后面
			if (rotateArray[mid] >= rotateArray[left]) {
				left = mid;
			}
			// 中间元素位于后面的递增子数组, 此时最小元素位于中间元素的前面
			else 
			{
				right = mid;
			}
		}
		return rotateArray[mid];
	}
private:
	// 顺序寻找最小值
	int MinOrder(vector &num, int left, int right) {
		int result = num[left];
		for (int i = left + 1; i < right; ++i) {
			if (num[i] < result) {
				result = num[i];
			}
		}
		return result;
	}
};

int main() {
	Solution s;
	vector num = {0,1,2,3,4,5};
	//vector num = {4,5,6,7,1,2,3};
	//vector num = { 2,2,2,2,1,2 };
	int result = s.minNumberInRotateArray(num);
	// 输出
	cout << result << endl;
	return 0;
}

编程笔记

  • 代码实现解题思路:代码实现1直接使用sort进行排序然后取数组第一位元素;代码实现2根据题目数组的规律使用二分查找法排序,是较优的方法;
  • 熟悉使用sort算法;
    C++&sort算法参考链接

你可能感兴趣的:(C++,面试编程题)