剑指Offer53 在排序数组中查找数字I

Posted 小布丁value

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer53 在排序数组中查找数字I相关的知识,希望对你有一定的参考价值。

在排序数组中查找数字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

剑指 Offer 53 - I. 在排序数组中查找数字 I c++/java详细题解

剑指OFFER----面试题53 - I. 在排序数组中查找数字 I

剑指Offer53 在排序数组中查找数字I