冷血之心的博客

天之道,损有余而补不足,是故虚胜实,不足胜有余。欢迎各位关注我的博客,有问题可以加QQ群366533258交流哦~...

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


(尊重劳动成果,转载请注明出处: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);
		else
			return 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#管理一枚。欢迎大家进来交流技术。







阅读更多
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_25827845/article/details/74065254
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭