• 6 旋转数组的最小数字


     

    题目描述

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

     思路:

    旋转之后的数组可以看成是2个排序的子数组,而且前面的子数组的元素都大于或者等于后面的子数组。


    我们用2个指针分别指向第一个数组的第一个元素,和 第二个数组的最后一个元素。2个指针记为left, right .

    中间元素 记为mid mid=left+(left-right)/2

    如果left<mid (34512) 说明 mid 在第一个子数组里,令left=mid 继续查找
    如果right>mid (45123) 说明 mid 在第二个子数组里,令 right= mid 继续查找

    终止条件 :当2个指针的距离是1的时候,表明第一个指针已经指向了第一个递增子数组的末尾,而第二个指向了第二个递增子数组的开头。

    特殊情况 【1 1 1 0 1】 
    mid left right 相等 顺序查找

    
    
     1 import java.util.ArrayList;
     2 public class Solution {
     3     public int minNumberInRotateArray(int [] a) {
     4         if(a.length==0) return 0 ;
     5         int left = 0,right = a.length-1,mid=0;
     6         while(a[left]>=a[right]){
     7             if(right-left==1) return a[right];
     8             
     9             mid = left +(right-left)/2;
    10            // 特殊处理[1 1 1 0 1]
    11             // code
    12             if((a[mid]==a[right])&&(a[mid]==a[left]))
    13                 return find_min(a,left,right);
    14             //
    15             if(a[left]<=a[mid]) left =mid;
    16             if(a[right]>=a[mid])right = mid;
    17         }
    18         return a[mid];
    19     }
    20     private int find_min(int[] a,int left,int right){
    21         int min = a[left];
    22         for(int i =left;i<=right;i++)
    23             if(a[i]<min) 
    24                 min =a[i];
    25         return min;
    26     }
    27 }
     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3     def minNumberInRotateArray(self,a):
     4         # write code here
     5         def mymin(a):
     6             m = a[0]
     7             for i in a:
     8                 if(i<m):
     9                     m = i
    10             return m
    11         left = 0
    12         right = len(a)-1
    13         while(a[left]>=a[right]):
    14             if(right-left==1):
    15                 return a[right]
    16             mid = left + int((right - left)/2) 
    17             if(a[mid]==a[right] and a[mid]==a[left]):
    18                 return mymin(a)
    19             if(a[left]<=a[mid]):
    20                 left = mid
    21             if(a[right]>=a[mid]):
    22                 right = mid
    23         return a[mid]
    c++:20180807
     1 class Solution {
     2 public:
     3     int minNumberInRotateArray(vector<int> a) {
     4          int lo = 0;
     5          int hi = a.size()-1;
     6          int mid = 0;
     7          while(a[lo]>=a[hi]){
     8              if(hi - mid==1)
     9                  return a[hi];
    10             mid = lo +(hi-lo)/2;
    11              if(a[mid]==a[hi]&&a[mid]==a[lo])
    12                  return findMin(a);
    13              
    14              if(a[lo]<=a[mid])
    15                  lo = mid;
    16              if(a[hi]>=a[mid])
    17                  hi = mid;
    18          }
    19         return 1;
    20     }
    21     int findMin(std::vector<int> v){
    22         int m = v[0];
    23         for(int i=1;i<v.size();i++)
    24             if(m<v[i])
    25                 m=v[i];
    26         return m;
    27     }
    28 };
  • 相关阅读:
    <a>元素生成多个<a>的问题,元素标签结尾影响
    mysql不能插入中文数据
    java: Multiple encodings set for module chunk test "GBK" will be used by compiler
    过滤器第二篇【高级应用】
    过滤器第一篇【介绍、入门、简单应用】
    客户关系管理系统
    Mysql中文乱码
    用户登陆注册【JDBC版】
    Mysql的基本命令图
    购物车小案例【简单版】
  • 原文地址:https://www.cnblogs.com/zle1992/p/7787351.html
Copyright © 2020-2023  润新知