剑指Offer53 在排序数组中查找数字I
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer53 在排序数组中查找数字I相关的知识,希望对你有一定的参考价值。
方法一:暴力解法
直接用hashmap,就是有点丢人哈
class Solution {
HashMap<Integer,Integer> map=new HashMap<>();
public int search(int [] nums,int target){
for( int num:nums){
if(!map.containsKey(num)){
map.put(num,1);
}else{
map.put(num,map.get(num)+1);
}
}
for(int num:nums){
if(num==target){
return map.get(num);
}
}
return 0;
}
}
方法二:循环二分:
1.初始化 i=0,j=nums.length-1;
2.循环二分:当闭区间[i,j]无元素时跳出
3.计算中点:m=(i+j)/2;
当nums(m)<target target在[m+1,j];
nums(m)>target target在[i,m-1];
nums(m)=target 右边界在[m+1,j],左边界在[i,m-1]
因此找右边界
i=m+1;
j=m-1;
public static int search(int [] nums,int target){
int i=0,j=nums.length-1;
//寻找右边界
while(i<=j){
int m=(i+j)/2;
if(nums[m]<=target) i=m+1;
else j=m-1;
}
int right=i;
//若数组中无元素target,则直接返回
if(j>=0&&nums[j]!=target) return 0;
//寻找左边界
i=0;
j=nums.length-1;
while(i<=j){
int m=(i+j)/2;
if(nums[m]>=target) j=m-1;
else i=m+1;
}
int left=j;
return right-left-1;
}
以上是关于剑指Offer53 在排序数组中查找数字I的主要内容,如果未能解决你的问题,请参考以下文章
剑指Offer面试题53 - I. 在排序数组中查找数字 I
算法剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I c++/java详细题解