• 153. Find Minimum in Rotated Sorted Array


    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

    Find the minimum element.

    You may assume no duplicate exists in the array.

    开始做的时候,想出了一种用treeset做的方法,代码如下:

    public class Solution {

        public int findMin(int[] nums) {

            TreeSet<Integer> set = new TreeSet<Integer>();

            int min = Integer.MAX_VALUE;

            for(int i=0;i<nums.length;i++){

                Integer floor = set.floor(nums[i]);

                if(floor!=null){

                    min = Math.min(min,floor);

                }

                set.add(nums[i]);

            }

            min = Math.min(min,nums[nums.length-1]);

            return min;

        }

    }

    但是时间复杂度是NlogN,后来又用二分查找做出来的,二分查找通常是在原数组已经排好序的时候使用:

     1 public class Solution {
     2     public int findMin(int[] nums) {
     3         int left = 0;
     4         int right = nums.length-1;
     5         while(left<right){
     6             int mid = left+(right-left)/2;
     7             if(nums[left]<nums[right]) return nums[left];
     8             else if(nums[left]<=nums[mid]) left = mid+1;
     9             else right = mid;
    10         }
    11         return nums[left];
    12     }
    13 }
    14 //the run time complexity could be O(logn),the space complexity could be O(1); 

    本题可以省略if(nums[left]<nums[right]) return nums[left];的步骤,就是以将mid和右面进行比较,代码如下:

    public class Solution {

        public int findMin(int[] nums) {

            int left = 0;

            int right = nums.length-1;

            for(int i=0;i<nums.length;i++){

                int mid = left+(right-left)/2;

                if(nums[mid]<nums[right]){

                    right = mid;

                }else if(nums[mid]>nums[right]){

                    left = mid+1;

                }

            }

            return nums[left];

        }

    }

    他们之间的区别可以通过一个例子看出来nums = {1,3},对于第一种解法,如果不加入if(nums[left]<nums[right]) return nums[left];那么mid的值就是和left相等的,这种情况是无法排除出去的。而对于第二种情况,mid的性质是一直在前半部分赋值,意思是如果是两个元素,那么mid就是第一个元素;如果是三个元素,那么是中间的元素。所以mid永远不可能和right是相等的,所以不需要考虑mid=right的情况。

  • 相关阅读:
    maven-仓库
    maven-坐标与依赖
    maven-认识
    mysql-介绍
    redis-主从复制
    UVA
    UVA
    UVA
    UVA
    [ Java学习 ] 查阅资料整理 004
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6359734.html
Copyright © 2020-2023  润新知