剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数

来源:互联网 发布:javascript难不难 编辑:程序博客网 时间:2024/06/03 06:51


(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74065254冷血之心的博客)



剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数


题目一:数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,所以输出4.


思路一:

最直观的想法,遍历一遍该数组,统计出现的次数,时间复杂度为O(N),可以先和面试官说一下,就说这是最直观的解法(面试官会觉得这小伙子思维比较敏捷,哈哈~)


思路二:

看到排序数组,必须敏锐的想到可以使用二分查找算法。二分算法,我们先比较中间的值和目标target的关系,然后分区间找出该数组中第一次出现目标target和最后一次出现target的位置,两者相减即为该目标出现的次数。整体的时间复杂度为O(logN)


思路一代码:

public int GetNumberOfK(int [] array , int k) {       if(array==null||array.length==0)           return 0;        int count = 0;        for(int i =0;i<array.length;i++){            if(array[i]==k)                count++;        }        return count;    }



思路二代码:

public int GetNumberOfK(int[] array , int target) {if(array==null||array.length==0)return 0; return getCount(array,0,array.length-1,target);}private int getCount(int[] array, int start, int end, int target) {if(array==null||array.length==0)return -1;if(start>end) // 先判断start和end的关系,防止mid大于数组长度,出现空指针异常return 0;int mid = start+(end-start)/2;int midValue = array[mid];if(midValue>target)return getCount(array, start, mid-1, target);else if (midValue<target) return getCount(array, mid+1, end, target);elsereturn 1+getCount(array, start, mid-1, target)+getCount(array, mid+1, end, target);}



题目二:0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1范围内的n个数字中有且只有一个数字不在该数组中,请找出该数字。



题目三:数组中数值和下标相等的元素。

假设一个单调递增的数组里边的每个元素都是整数并且是唯一的。请实现一个函数,找出数组中任意一个数值等于其下标的元素。例如在数组{-3,-1,1,3,5}中,数字3和它的下标相等。



以上两个题目几乎就是标准的二分查找算法哦~




如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~



本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。







阅读全文
1 1
原创粉丝点击