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;
        }
    };
    
  • 相关阅读:
    自定义IP原来如此简单
    [转]如何在NIOS II中读写EPCS剩余空间
    坏了的芯片居然又好了一片,太神奇了
    今天报废两片EP3C5E144
    Quartus II 订购版 v10.1 正式推出下载
    发现用JTAG下载程序到EPCS比用AS方式下载速度快
    如何解决No EPCS layout data looking for section [EPCSXXXXXX]
    QII丰衣足食
    Why does my Cyclone III FPGA fail to access the EPCS device using the EPCS Controller module?
    <转载>在.NET中基于Windows消息的IPC实现
  • 原文地址:https://www.cnblogs.com/hesper/p/10417550.html
Copyright © 2011-2022 走看看