关闭

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

标签: 面试题二分查找算法剑指Offer
1321人阅读 评论(0) 收藏 举报
分类:


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







1
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

剑指offer:数组中只出现一次的数字(java)

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).     如输入数组{2,4,3,6,3,2,5,...
  • abc7845129630
  • abc7845129630
  • 2016-10-06 19:03
  • 1088

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

关于剑指Offer中二分查找算法的实际应用举例
  • qq_25827845
  • qq_25827845
  • 2017-07-01 16:05
  • 1321

剑指offer题目及答案

剑指offer最近在牛客网上刷剑指offer的题目,现将题目和答案总结如下
  • panda_AJ
  • panda_AJ
  • 2017-04-06 19:07
  • 1599

【剑指offer】面试题53(1):数字在排序数组中出现的次数

题目统计一个数字在排序数组中出现的次数。思路二分法找到该数字的第一个下标,和最后一个下标 若在数组中找到某下标对应的值为k,  如果它的前一个数字不为k,则它就是第一个k;  如果它的后一个数字...
  • qq1263292336
  • qq1263292336
  • 2017-08-01 14:28
  • 107

剑指Offer(第二版)面试题56:数组中数字出现的次数

剑指Offer(第二版)面试题56:数组中数字出现的次数
  • qq_25827845
  • qq_25827845
  • 2017-06-22 20:07
  • 1277

剑指offer--面试题53 在排序数组中查找数字(二分)

//数字在排序数组中出现的次数 #include using namespace std; int GetFirstK(const int* data,int length,int k,int...
  • lengshien
  • lengshien
  • 2017-05-12 09:10
  • 176

剑指 offer代码解析——面试题38数字在排序数组中出现的次数

题目:统计一个有序数组中K出现的次数。 分析:本题最直观的思路就是遍历数组,统计K出现的次数即可。 这种方式的时间复杂度为O(n)。下面我们充分利用“有序数组”这一条件,提高算法的时间效率...
  • u010425776
  • u010425776
  • 2016-03-26 09:09
  • 748

《剑指Offer》面试题:统计一个数字在排序数组中出现的次数

题目 题目描述: 统计一个数字在排序数组中出现的次数。 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小。1<=n <= 10^6。 第二行有n个整...
  • u010412719
  • u010412719
  • 2015-09-12 22:23
  • 1203

剑指offer-面试题38-数字在排序数组中出现的次数

package case38_NumbersOfK; /** * 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次...
  • VIP_WangSai
  • VIP_WangSai
  • 2017-05-01 18:21
  • 288

【剑指offer】面试题38-数字在排序数组中出现的次数

问题描述:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3字数组中出现了4次,因此输出4.问题分析:方法1:利用二分查找的思想,找到中间数据是不是...
  • peiyao456
  • peiyao456
  • 2017-01-23 14:23
  • 477
    本人发布的gitChat,欢迎点进去交流
    个人资料
    • 访问:771349次
    • 积分:9215
    • 等级:
    • 排名:第2330名
    • 原创:213篇
    • 转载:30篇
    • 译文:0篇
    • 评论:461条
    人生格言
    天之道,损有余而补不足,是故虚胜实,不足胜有余。
    我的QQ群
    技术交流大杂烩
    博客专栏
    最新评论
    扫码加-技术交流QQ群
    PV统计