[La espada se refiere a la oferta] 53.2 Los números que faltan en 0 ~ n-1

Descripción del Título

Inserte la descripción de la imagen aquí

// 53.2 0~n-1中缺失的数字
 
// 力扣
// 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都
// 在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该
// 数组中,请找出这个数字。



 

responder

/ 直接法 
// 直接法不通用,还是得想想其他方法。

// 力扣
// 根据题意,说明元素和索引必须相等,不相等说明索引对应的元素缺失,
// 就直接返回索引。如果遍历完没发现元素索引的冲突,说明缺失的就是末端元素
// 直接返回末端的下一位索引。
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:39 MB, 在所有 Java 提交中击败了50.07%的用户
class Solution {
    public int missingNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (i != nums[i])
                return i;
        }
        return nums.length;
    }
}





// 二分查找 ///

// 力扣
// 二分查找法和53题是一样的,
// 初始化首尾指针left和right,对半取中间位索引mid = (left + right) / 2
// ,如果遍历的元素nums[mid]和mid相等,说明缺失元素的位置在右半边,left更新
// 为mid+1,否则(如果遍历元素nums[mid]<mid),说明缺失元素在左半边,
// right更新为mid-1,left和right相遇时即为缺失元素的索引位置,直接返回即可
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.9 MB, 在所有 Java 提交中击败了60.99%的用户
class Solution {
    public int missingNumber(int[] nums) {
		int left = 0;
		int right = nums.length - 1;
		while (left <= right) {
			int mid = (left + right) / 2;
			if (nums[mid] == mid)
				left = mid + 1;
			else  // nums[mid] < mid
				right = mid - 1;
		}
		return left;
    }
}

Supongo que te gusta

Origin blog.csdn.net/fisherish/article/details/114733075
Recomendado
Clasificación