zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

    旋转数组的最小数字

    题目描述

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

    特殊输入{1, 2, 3, 4, 5}; {1, 1, 1, 0, 1}; {1, 0, 1, 1, 1}-->这时版本二, 三只能暴力查找了, 看看版本三med如何初始化

    版本一: 从头到尾遍历数组找出最小值, 没什么技术含量,

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

    版本二: 递归版, vt[middle]vt[start]之间用>还是>=是个疑问

    class Solution {
    public:
            int min(vector<int> vt) {
                int ret = 0;
                int len = vt.size();
                for (int i = 0; i < len; i++) {
                    if (vt[i] > vt[i+1]) {
                        ret = vt[i+1];
                        break;
                    }
                }
                
                return ret;
        }
        
        int find(vector<int> vt, int start, int end) {
            int ret;
            int middle = 0;
            
            middle = (start + end) / 2;
            
            if (start+1 == end) {
                
    			//不需要这么判断, start永远指向最小值的前面元素
                //return vt[start] < vt[end] ? vt[start] : vt[end];	
    			return vt[end];
            }
            
            
            if (vt[middle] == vt[start] == vt[middle] == vt[end]) {
                ret = min(vt);
            }
    		// 这么判断牛客上输出结果在下图
            //else if (vt[middle] > vt[start]) {		
            else if (vt[middle] >= vt[start]) {
                start = middle;
                ret = find(vt, start, end);
            }
            else if (vt[middle] <= vt[start]) {
                end = middle;
                ret = find(vt, start, end);
            }
            
            return ret;
        }
        
        int minNumberInRotateArray(vector<int> rotateArray) {
            int ret = 0;
            int len = rotateArray.size();
            
            if (0 == len) {
                ret = 0;
            }
            else if (1 == len) {
                ret = 1;
            }
            else {
                ret = find(rotateArray, 0, len - 1);
            }
            
            return ret;
        }
    };
    

    版本四: 非递归版二分法查找, ret初始化为数组第一个结点, 使用while(rotateArray[start] >= rotateArray[end])这么判断, 当数组为有序时, 直接返回最小值

    class Solution {
    public:
            int min(vector<int> vt) {
                int ret = 0;
                int len = vt.size();
                for (int i = 0; i < len; i++) {
                    if (vt[i] > vt[i+1]) {
                        ret = vt[i+1];
                        break;
                    }
                }
                
                return ret;
        }
        
        int minNumberInRotateArray(vector<int> rotateArray) {
            int ret = 0;
            int start = 0;
            int end = 0;
            int med = start;
            
            if (0 == rotateArray.size()) {
                return ret;
            }
            
            end = rotateArray.size() - 1;
    		ret = rotateArray[start];
            //while(1 != (end - start)) {
    		while(rotateArray[start] >= rotateArray[end]) {
    
                if (rotateArray[start] == rotateArray[med] == rotateArray[end]) {
                    ret = min(rotateArray);
                    break;
                }
                
    			med = (start + end) / 2;
                if (rotateArray[med] >= rotateArray[start]) {
                    start = med;
                }
                else if ((rotateArray[med] <= rotateArray[end])) {
                    end = med;
                }
    			ret = rotateArray[end];        
    		}
            
            return ret;
        }
    };
    
  • 相关阅读:
    微信小程序中的WXS语法
    小程序 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内
    Linux 远程连接sftp与ftp
    MySQL使用方法
    Rsync+Inotify实时同步环境部署
    inotify+rsync实时同步
    rsync备份
    C# 基于ef的2种简单的仓储封装和工作单元 net core3.1 ---sqlserver 2019
    xshell个人免费版下载使用
    Git 命令之 git add、git commit
  • 原文地址:https://www.cnblogs.com/hesper/p/10417550.html
Copyright © 2011-2022 走看看