热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在排序数组中查找数字0~n1中缺失的数字

在排序数组中查找数字统计一个数字在排序数组中出现的次数。示例1:输入:nums[5,7,7,8,8,10],target8输出:2示例2:输入:nums[5,7,7,8,8,10




在排序数组中查找数字

统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8 输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6 输出: 0
提示:


  • 0 <&#61; nums.length <&#61; 105
  • -109 <&#61; nums[i] <&#61; 109
  • nums 是一个非递减数组
  • -109 <&#61; target <&#61; 109

分析

在这里插入图片描述

一般这种题目在有序数组中查找一个数字都采用二分查找法。
需要记住以下模板套用&#xff1a;
// 向下取整
int mid &#61; (right - left) / 2 &#43; left;
//向上取整
int mid &#61; (right - left &#43; 1) / 2 &#43; left;
常⻅题型&#xff1a;
1.寻找第⼀个⼤于等于 target 的数
2.寻找第⼀个等于 target 的数
3.寻找最后⼀个⼤于等于 target 的数
4.寻找最后⼀个等于 target 的数

//寻找第⼀个等于 target 的数的下标
int search2(int[] nums, int target){
if(nums &#61;&#61; null || nums.length <&#61; 0){
return -1;
}
int left &#61; 0, right &#61; nums.length - 1;
while(left < right){
// 向下取整
int mid &#61; (right - left) / 2 &#43; left;
if(nums[mid] >&#61; target){
right &#61; mid;
}else{
left &#61; mid &#43; 1;
}
}
// 判断该数是否存在
if(nums[left] !&#61; target) return -1;
return left;
}

//4.寻找最后⼀个等于 target 的数下标
int search4(int[] nums, int target){
if(nums &#61;&#61; null || nums.length <&#61; 0){
return -1;
}
int left &#61; 0, right &#61; nums.length - 1;
while(left < right){
//向上取整
int mid &#61; (right - left &#43; 1) / 2 &#43; left;
if(nums[mid] <&#61; target){
left &#61; mid;
}else{
right &#61; mid - 1;
}
}
// 判断该数是否存在
if(nums[left] !&#61; target) return -1;
return left;
}

代码

class Solution {
public int search(int[] nums, int target) {
int i &#61; search2(nums,target);
int j &#61; search4(nums,target);
if(j&#61;&#61;-1||i&#61;&#61;-1){
return 0;
}
return j-i&#43;1;
}
int search2(int[] nums, int target){
if(nums &#61;&#61; null || nums.length <&#61; 0){
return -1;
}
int left &#61; 0, right &#61; nums.length - 1;
while(left < right){
// 向下取整
int mid &#61; (right - left) / 2 &#43; left;
if(nums[mid] >&#61; target){
right &#61; mid;
}else{
left &#61; mid &#43; 1;
}
}
// 判断该数是否存在
if(nums[left] !&#61; target) return -1;
return left;
}
//4.寻找最后⼀个等于 target 的数下标
int search4(int[] nums, int target){
if(nums &#61;&#61; null || nums.length <&#61; 0){
return -1;
}
int left &#61; 0, right &#61; nums.length - 1;
while(left < right){
//向上取整
int mid &#61; (right - left &#43; 1) / 2 &#43; left;
if(nums[mid] <&#61; target){
left &#61; mid;
}else{
right &#61; mid - 1;
}
}
// 判断该数是否存在
if(nums[left] !&#61; target) return -1;
return left;
}
}

在这里插入图片描述


0&#xff5e;n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。
在这里插入图片描述


分析

这种有序的数组采用二分查找时间复杂度最低&#xff0c;比较数组下标和数组值是否相等。
在这里插入图片描述


代码

class Solution {
public int missingNumber(int[] nums) {
int left &#61; 0;
int right &#61; nums.length-1;
while(left<right){
//向上取整
int mid &#61; (right-left)/2&#43;left;
if(nums[mid]&#61;&#61;mid){
left &#61; mid&#43;1;
}else{
right &#61; mid;
}
}
return nums[left]&#61;&#61;left?left&#43;1:left;
}
}

在这里插入图片描述







推荐阅读
author-avatar
倒退淂磁带_628
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有