力扣剑指offer 第4天 查找算法(简单) 剑指 Offer 03. 数组中重复的数字 LCOF 剑指 Offer 53 - I. 在排序数组中查找数字 LCOF 剑指 Offer 53 - II. 缺失的数字 LCOF
剑指 Offer 03. 数组中重复的数字 LCOF
//这题可以用set简单判断是否已经有存在的值 提高效率可以用一个数组对应放置值如果冲突则输出即可
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
Integer n = num;
if(set.contains(n))return num;
set.add(num);
}
return 0;//这个只是避免报错
}
}
剑指 Offer 53 - I. 在排序数组中查找数字 L
题目
统计一个数字在排序[非递减]数组中出现的次数。
思路
- 二分搜索效率超高![一开始就给m赋值(l+r)/2则最后可以直接使用m]
- 特判空数组 直接返回0
- 二分搜索 找到一个target所在的位置m
- nums[m]!=target(没找到)返回0
- nums[m]==target (n=1) 左右搜寻target 找到则n++
- 返回n
代码
class Solution {
public int search(int[] nums, int target) {
if(nums.length==0)return 0;//空数组特判
int l = 0, r = nums.length - 1;
int m = (l + r) >> 1;
//2分查找找到target其中一个值所在位置
while (l < r && nums[m] != target) {
if (nums[m] > target) r = m;
else l = m + 1;
m = (l + r) >> 1;
}
//先判读该位置是不是target
if (nums[m] != target) return 0;
int n = 1;
//左右寻找
for (int i = m + 1; i < nums.length; i++)
if (nums[i] == target) n++;
else break;
for (int i = m - 1; i >= 0; i--)
if (nums[i] == target) n++;
else break;
return n;
}
}
剑指 Offer 53 - II. 缺失的数字 LCOF
题目
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
思路
二分搜索[m没有在初始化的时候赋予(l+r/2)则最后应该用r或l代表m]
如果nums[m]=m说明左边不缺右边缺 l=m+1
如果nums[m]!=n 说明左边缺r=m
如果最后nums[r]=r说明缺的是n(nums.length)否则缺的是r
代码
class Solution {
public int missingNumber(int[] nums) {
int l=0,r=nums.length-1,m=0;
while (l<r){
m = (l+r)>>1;
if(nums[m]==m)l=m+1;
else r=m;
}
if(nums[r]==r)return nums.length;
return r;
}
}