欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-28 11:40:46
...
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));
	}
}

 

上一篇:

下一篇: