剑指 Offer 53 - II. 0~n-1中缺失的数字

知识点:数组,二分查找

题目描述

统计一个数字在排序数组中出现的次数。

示例
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2 输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

解法一:二分查找

看到排序数组--> 二分查找;

根据题目:可以根据是否和索引对应分成两部分:

  • 1.nums[i] == i; 索引和值能一一对应上;
  • 2.nums[i] != i; 索引和值对不上了;

我们要找的就是第一个对不上的时候的索引;也就是右子数组的首位元素;

和33题一样,要明确的一点是最后执行的一定是left=right=mid,而且此时mid左侧都是对应的,mid右侧都是不对应的,所以判断此刻mid的值:

  • 1.nums[mid] == mid; 那left=mid+1就是第一个不匹配的;
  • 2.nums[mid] != mid,那left就是第一个不匹配的;

    所以最后返回left就可以了。
class Solution {
public int missingNumber(int[] nums) {
int left = 0, right = nums.length-1;
while(left <= right){
int mid = left + ((right-left) >> 1);
if(nums[mid] == mid){
left = mid+1; //一定在右边;
}else{
right = mid-1; //可能正好是mid,但是我们还是可以mid-1,因为最后如果相等了,我们返回的是left;
//在上面执行了+1的操作,所以正好是不等的。要始终明白在最后时刻的时候,left=mid=right,而且mid左边都排好了,mid右边都乱了,只要看mid这个就行了;
//(注意和153题区分,那里就不能减1);
}
}
return left;
}
}

最新文章

  1. 把UI图里的小图标制作成icon font
  2. Suggestion(搜索建议)产品和技术
  3. toolkit学习笔记
  4. storm如何分配任务和负载均衡?
  5. C/C++中的隐藏依赖
  6. [Flex] ButtonBar系列——皮肤和外观设置
  7. MAC上 nodejs express 安装
  8. 《head first java 》读书笔记(二)
  9. 在WIN32 DLL中使用MFC
  10. 【转】VS2013编译libjpeg库
  11. 【sql】经典SQL语句大全
  12. Promise原理 &amp;&amp; 简单实现
  13. TIME_WAIT 另一种解决方式 SO_LINGER
  14. Linux编程之epoll
  15. AngularJS–Scope(作用域)
  16. sublime安装 和 插件安装
  17. python-day19 Django模板,路由分发,ORM
  18. CentOS 7 设置默认进入图形界面或文本界面
  19. Hello 2019 (D~G)
  20. 重写( override)and 重载(overload)

热门文章

  1. WEB安全新玩法 [4] 防护邮箱密码重置漏洞
  2. kubernetes之副本控制器(RC/RS)
  3. 自然语言处理(NLP)——简介
  4. 使用了gitlab管理pipeline,Jenkinsfile 中在出现克隆命令流水线执行会混乱
  5. CentOS-配置JDK(压缩包)
  6. shell下读取文件数据
  7. springboot项目启动,停止,重启
  8. PHP单例模式 (转)
  9. WPF教程十二:了解自定义控件的基础和自定义无外观控件
  10. 【重学Java】多线程进阶(线程池、原子性、并发工具类)