• leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 II


    leetcode刷题笔记一百五十三题与一百五十四题 寻找旋转排序数组中的最小值 I与 II

    源地址:

    153. 寻找旋转排序数组中的最小值

    154. 寻找旋转排序数组中的最小值 II

    问题描述:

    153题问题描述

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    请找出其中最小的元素。

    你可以假设数组中不存在重复元素。

    示例 1:

    输入: [3,4,5,1,2]
    输出: 1
    示例 2:

    输入: [4,5,6,7,0,1,2]
    输出: 0

    154题问题描述

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。

    ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

    请找出其中最小的元素。

    注意数组中可能存在重复的元素。

    示例 1:

    输入: [1,3,5]
    输出: 1
    示例 2:

    输入: [2,2,2,0,1]
    输出: 0

    //使用二分法进行处理 由于旋转数组原先为有序 left < mid < right 
    //进行旋转后, 当 right < mid时 则旋转点位于右侧区间,否则位于左侧区间
    
    // 153题解法
    object Solution {
        def findMin(nums: Array[Int]): Int = {
            var left = 0
            var right = nums.length - 1
    
            while (left < right) {
                val mid = (left + right)/2
                if (nums(right) < nums(mid)) left = mid + 1
                else right = mid
            }
    
            return nums(left)
        }
    }
    
    //154题解法
    //154题较153题主要区别在于存在重复值,当对比两值相等,无法判断旋转点区间位于左侧还是右侧,故需要移动右侧指针位置,直到两者不相等
    object Solution {
        def findMin(nums: Array[Int]): Int = {
            var left = 0
            var right = nums.length - 1
    
            while (left < right) {
                val mid = (left + right) / 2
                if (nums(mid) > nums(right)) left = mid + 1
                else if (nums(mid) < nums(right)) right = mid
                else right -= 1
            }
            return nums(left)
        }
    }
    
  • 相关阅读:
    自定义button
    图片拉伸
    通过偏好设置进行数据存储
    AppDelegate中的方法解析
    copy-mutableCopy
    NSNumber、NSValue、NSDate、NSObject
    iOS OC语言原生开发的IM模块--RChat
    文件缓存
    ios基础动画、关键帧动画、动画组、转场动画等
    Moya/RxSwift/ObjectMapper/Alamofire开发
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13601588.html
Copyright © 2020-2023  润新知