剑指offer--Day4

Posted Recently 祝祝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer--Day4相关的知识,希望对你有一定的参考价值。

一位比我大两届的大哥(坐我的对面的侧边)看着我说:没事学习一下,顺便搞个项目出来。我真的会笑,问他怎么知道我没事干,他说没集中精神,我在看着算法题目,在分析,他说我没有集中精神,真厉害,哈哈哈。

Day4:剑指 Offer 11. 旋转数组的最小数字

力扣链接:剑指 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]] 。

题解:双指针解法,数组升序排列,由列子:numbers = [3,4,5,1,2]可以看出,是由中间值往后往前的两个升序有序数组,前边的的数组与后边的数组升序排列,使用双指针的写法,一开始循环就判断左指针如果小于右指针直接返回(这是关键,最小值总是最左边的数),其他都是指针移动,若中间值大于最右边的值,l=mid+1(最小值在右边),若中间值小于最右边的值,r=mid(最小值再右边),相等的时候向右移动一位

一开始:numbers[l]<numbers[r],第一个数组的最小值,小于第二个数组最大值(不存在此类情况)
循环开始:取中间值,

class Solution 
    public int minArray(int[] numbers) 
        int l=0;
        int r=numbers.length-1;
        while(l<r)
            if(numbers[l]<numbers[r])
                return numbers[l];
            
            int middle = (l+r)/2;
            
            if(numbers[l]>numbers[middle])//第一个数组只有一个值的时候
                r=middle;
            else if(numbers[l]<numbers[middle])//移动到第二个数组
                l=middle+1;
            else //相等的时候直接移动
                l++;
            
        
        return numbers[l];
    

Day4:剑指 Offer 12. 矩阵中的路径

力扣链接:剑指 Offer 12. 矩阵中的路径

Day4:面试题13. 机器人的运动范围

力扣链接:面试题13. 机器人的运动范围

以上是关于剑指offer--Day4的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--Day4

[剑指Offer][数组]数字在升序数组中出现的次数

剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)

剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)

剑指offer(C++)-JZ53:数字在升序数组中出现的次数(算法-搜索算法)

《剑指Offer》题十一~题二十