剑指offer书(53)-2:0-n-1中缺失的数字

package project;

/**
 * 题目:0-n-1中缺失的数字。数组是递增数组,所有数字唯一一个。 0-n-1有且只有一个数字不在该数组。
 * 
 * @author hexiaoli 
 * 思路:剑指offer 思路: 1)求0-n-1的和,再求实际数组中0-n-1的和,做差就好了。
 *2)二分法。如果中间元素值和下标相等,那么下一轮只需要查找右半边,如果不等且前一个元素和下标相同,则找到。
 *         如果不等且前一个元素和下标不同,查找左半边。
 * 
 */

public class Main {

	public static int getMissingNumber(int[] array, int length) {
		// 边界
		if (array == null || array.length <= 0 || length <= 0) {
			return -2;
		}//判断首尾
		if(array[0]!=0) {
			return 0;
		}
		if(array[array.length-1]==length-2) {
			return array.length;
		}
		// 左右两个指针
		int left = 0;
		int right = length - 1;
		// 如果两个指针不相遇则一直循环
		while (left <= right) {
			//取中值
			int mid = (left + right) >> 1;
			//如果中间元素值和下标不等
			if (mid<=right&&array[mid] != mid) {
				//已经到了数组开始或者中间元素值左边和下标相等
				if (mid == 0 || array[mid - 1] == mid - 1) 
					return mid;
				right = mid - 1;//只在数组左侧出现
			} else {//中间元素值和下标等
				left = mid + 1;//只在数组右侧出现
			}
		}
		//左边指针到末尾,说明没有发现缺少的情况		
		if(left == length) {
			return -1;
		}
		return -1;
	}

	public static void main(String[] args) {
		int[] array = { 0, 2 };
		int[] array1 = { 1, 2 };
		int[] array2 = { 0 };
		int[] array3 = {};
		int[] array4 = { 0, 1, 2 };
		System.out.println(getMissingNumber(array,3));
		System.out.println(getMissingNumber(array1,3));
		System.out.println(getMissingNumber(array2,1));
		System.out.println(getMissingNumber(array3,0));
		System.out.println(getMissingNumber(array4,3));
		System.out.println(getMissingNumber(array4,4));
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值