剑指 Offer 11. && LeetCode 154. 旋转数组的最小数字

这篇具有很好参考价值的文章主要介绍了剑指 Offer 11. && LeetCode 154. 旋转数组的最小数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考资料:LeetCode 官方解答

剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

示例 1:

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

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

===================================
思路:
注意到 旋转后的数组最小值与最右端的值之间特征
在最小值右边的值 都小于等于 最右端的值;
在最小值左边的值 都大于等于 最右端的值。
用二分法,
如果 中间值 小于 右端值,说明 中间值落在了最小值右边(或重合),即 最小值在左边的一半数组中(或重合);
如果 中间值 大于 右端值,说明 中间值落在了最小值左边, 即 最小值在右边的一半数组中;
如果 中间值 等于 右端值,此时 最小值可能落在左半数组( 2 2 1 2 2 2 2), 也有可能落在 右半数组( 2 2 2 2 1 2 2 )/ / 描黑的数 表示中间值;
考虑到while(l<r), m=(r+l)/2, m不可能等于r, 所以 在“ 中间值 等于 右端值”的情况下,我们可以令r=r-1, 表示删掉一个重复数,重新开始二分查找。
直到l==r,区间收缩到一个点上,那个点就是答案。文章来源地址https://www.toymoban.com/news/detail-488267.html

class Solution {
    public int minArray(int[] nums) {
        int l=0;
        int r = nums.length-1;
        int m = 0;
        
        while(l<r){
            m = (l+r)>>1;
            if(nums[m]<nums[r]){ // rihgt order                
                r=m;
            }else if(nums[m]>nums[r]){// // left order
                l=m+1;
                
            }else{
                r=r-1;
            }
        }
        return nums[r]; // or nums[l]
    }
}

到了这里,关于剑指 Offer 11. && LeetCode 154. 旋转数组的最小数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (数组与矩阵) 剑指 Offer 03. 数组中重复的数字 ——【Leetcode每日一题】

    难度:简单 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入 : [2, 3, 1, 0, 2, 5, 3] 输出 :2 或

    2024年02月16日
    浏览(39)
  • 154. 寻找旋转排序数组中的最小值 II

    已知一个长度为  n  的数组,预先按照升序排列,经由  1  到  n  次  旋转  后,得到输入数组。例如,原数组  nums = [0,1,4,4,5,6,7]  在变化后可能得到: 若旋转  4  次,则可以得到  [4,5,6,7,0,1,4] 若旋转  7  次,则可以得到  [0,1,4,4,5,6,7] 注意,数组  [a[0], a[1], a[2], ...,

    2024年02月15日
    浏览(39)
  • 每日一题 154寻找旋转排序数组中的最小值||(二分)

    已知一个长度为  n  的数组,预先按照升序排列,经由  1  到  n  次  旋转  后,得到输入数组。例如,原数组  nums = [0,1,4,4,5,6,7]  在变化后可能得到: 若旋转  4  次,则可以得到  [4,5,6,7,0,1,4] 若旋转  7  次,则可以得到  [0,1,4,4,5,6,7] 注意,数组  [a[0], a[1], a[2], ...,

    2024年02月13日
    浏览(35)
  • 每天一道leetcode:剑指 Offer 53 - I. 在排序数组中查找数字 I(适合初学者&二分查找)

    统计一个数字在排序数组中出现的次数。 0 = nums.length = 10^5 -10^9 = nums[i] = 10^9 nums 是一个非递减数组 -10^9 = target = 10^9 使用两次二分查找找到target在数组中的左右边界,然后长度就是右边界减去左边界再加一,最后返回长度即可。   欢迎大家在评论区讨论,如有不懂的代码部分

    2024年02月14日
    浏览(57)
  • 剑指offer45 把数组排成最小的数

    链接 其实这道题,大概看完就知道是一个排序的问题,无非就是数组中的元素以一个合适的位置排好序,这样从头加到尾,组成的整体数字最小!(题目中也暗示你排序问题了) 个人捉摸了一会,这道题能很好地锻炼仿函数的编写规则和库函数sort()的配套使用,还有就是巧妙地

    2024年01月16日
    浏览(42)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(51)
  • 剑指offer03.数组中重复的数字

    看到这道题的第一眼想到的是先给它排序,然后双指针从左往右遍历,写了一个冒泡排序,但是我想到了应该会超时,因为冒泡时间复杂度是n的平方,输入大小时10000,肯定会超时,然后右又看了一下题目看到数字都是0-n-1,灵感一下子就来了,我先创建一个等大的自然数数

    2024年02月11日
    浏览(40)
  • 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 利用题目的限制条件: 所有数字都在 0~n-1 的范围内 通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。 另一种写法

    2024年02月11日
    浏览(36)
  • 【剑指offer|1.数组中重复的数字】

    : 长度为n的数组nums中所有数字都在0~n-1范围内 返回任意一个重复的数字 总体时间复杂度和空间复杂度分析: 修改数组的方法: 因为有n个元素,每一个元素都在0~(n-1)范围内,如果元素不重复的话, 对数组重排之后,下标和元素值之间应该是一一对应的关系 但是因为

    2023年04月22日
    浏览(38)
  • 剑指 Offer 45. !!把数组排成最小的数(使用比较器的定制排序;快速排序)

    剑指 Offer 45. 把数组排成最小的数 中等 662 相关企业 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459” 这道题在左程云算法课上讲过,但是这次

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包