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

package leetcode;

public class offer_53_2 {
    
    //有序数组都应想到二分法
    public int missingNumber(int[] nums) {
        int left=0;
        int right=nums.length-1;
        int mid=(left+right)/2;
        int lmid=mid-left;
        int lnum=nums[mid]-nums[left];
        //如果不是从0开始,那就是0丢失
        if(nums[0]!=0) {return 0;}
        
        //如果最后一个值不是nums.length-1,则为nums.length-1
        if(nums[right]!=right+1) {return right+1;}
        
        //二分法
        while(left<right) {
            if(left==mid) {break;}
            
            //nums[j]-nums[i]的值与j-i值相等,则当前一半完整,否则在另一半
            if(lmid==lnum) {
                left=mid;
            }
            else {
                right=mid;
            }
            
            mid=(left+right)/2;
            lmid=mid-left;
            lnum=nums[mid]-nums[left];
        }
        //丢失的即为mid+1
        System.out.println(left+1);
        return left+1;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        offer_53_2 off=new offer_53_2();
        int[] nums= {0,1,2,3,4,5,6,7,9};
        off.missingNumber(nums);
    }

}

 

posted on 2022-03-05 16:21  一仟零一夜丶  阅读(16)  评论(0)    收藏  举报