zoukankan      html  css  js  c++  java
  • 153 Find Minimum in Rotated Sorted Array

    Suppose a sorted array 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.

    =========

    解决思路:

    /**
    012 3 4567
    701 2 3456
    670 2345
    567 0 1234
    456 7 0123
    345 6 7012
    234 5 6701
    123 4 5670
    */

    解决方式:利用二分搜索  去掉数组左右两部分中有序的部分。

    mid =( left+right)/2;

    mark表示最小值的下标,初始值为mark =right

    mid将nums分为左右两个部分,因为数组中没有重复元素,

    当nums[mid]<nums[right]时,数组右边部分有序,

      判断数组右边有序部分的最小值,是不是nums[mark]小

      此时数组右边已经搜索过了,应该在数组左边搜索,所以right = mid-1;

    当nums[mid]>nums[right],数组左边部分有序,

      判断数组左边有序部分的最小值,是不是比nums[mark]小,更新mark值[这里在代码里存在异议???和mark]

      此时数组左边以及搜索过了,应该在数组右边搜索,所以left = mid+1;

    int findMin(vector<int>& nums) {
            if(nums.size()==0)return 0;
            int left = 0;
            int right = nums.size()-1;
            int mark = right;
            while(left<=right){
                if(left+1==right){
                    mark = nums[left]<nums[mark]?left:mark;
                    mark = nums[right]<nums[mark]?right:mark;
                    break;
                }
                int mid = (left+right)/2;
                if(nums[mid]<nums[right]){
                    if(nums[mid]<nums[mark])
                        mark = mid;
                    right = mid-1;
                }else{
                    if(nums[left]<nums[mark])
                        mark = mid;
                    left = mid+1;
                }
            }///while
            return nums[mark];
        }
  • 相关阅读:
    STS 创建 Maven 项目填坑
    JeeSite | 访问控制权限
    《Spring + MyBatis 企业应用实战》书评
    MyBatis-Generator 用法介绍
    Java描述数据结构之链表的增删改查
    Java中的Object类的几个方法
    设计模式之策略模式(Strategy Pattern)
    设计模式之模板方法(Template Method)
    JeeSite | 数据分页与翻页
    day 19
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5566778.html
Copyright © 2011-2022 走看看