• 剑指offer【06】- 旋转数组的最小数字(java)


    题目:旋转数组的最小数字

    考点:查找和排序

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

    法一:利用Arrays.sort()排序

     1 import java.util.ArrayList;
     2 import java.util.Arrays;
     3 public class Solution {
     4     public int minNumberInRotateArray(int [] array) {
     5         //数组为空时
     6         if(array.length == 0){
     7             return 0;
     8         }
     9         //升序排序
    10         Arrays.sort(array);
    11         return array[0];
    12     }
    13 }

    法二:分情况讨论

    1.数组为空
    2.部分旋转,例如由(1,2,3,4,5)旋转为(3,4,5,1,2),此时只需要遍历数组,找到当前数比前面的数小的数即可。
    3.完全旋转,例如由(1,2,3,4,5)旋转为(1,2,3,4,5),此时第一个数最小。
     1 import java.util.ArrayList;
     2 import java.util.Arrays;
     3 public class Solution {
     4     public int minNumberInRotateArray(int [] array) {
     5         //数组为空时
     6         if(array.length == 0){
     7             return 0;
     8         }
     9         if(array.length == 1){
    10             return array[0];
    11         }
    12         //前部分数据旋转
    13         for(int i = 0; i < array.length - 1; i++){
    14             if(array[i] > array[i+1]){
    15                 return array[i+1];
    16             }
    17         }
    18         //全部数据旋转,相当于没有旋转
    19         return array[0];
    20     }
    21 }

    法三:二分法

     1 import java.util.ArrayList;
     2 import java.util.Arrays;
     3 public class Solution {
     4     public int minNumberInRotateArray(int [] array) {
     5         if (array.length == 0){
     6             return 0;
     7         } 
     8         int left = 0;
     9         int right = array.length - 1;
    10         int middle = 0;
    11         while (array[left]>=array[right]) {
    12             //数组长度等于2时
    13             if(right-left==1){
    14                 middle = right;
    15                 break;
    16             }
    17             middle = left + (right - left) / 2;
    18             if (array[middle] >= array[left]) {
    19                 left = middle;
    20             }
    21             if (array[middle] <= array[right]) {
    22                 right = middle;
    23             }
    24         }
    25         return array[middle];
    26     }
    27 }
  • 相关阅读:
    day02-数据库操作
    day01-MySQL介绍
    3-socketserver
    1-多线程与多进程
    keyword模块
    math模块
    查看进程pid与ppid
    开启进程的两种方式
    进程理论
    进程
  • 原文地址:https://www.cnblogs.com/linliquan/p/10590582.html
Copyright © 2020-2023  润新知