力扣 - 剑指 Offer 53 - II. 0~n-1中缺失的数字
2021-10-26 07:29
295 查看
题目
思路1
- 排序数组找数字使用二分法
- 通过题目,我们可以得到一个规律: 如果数组的索引值和该位置的值相等,说明还未缺失数字
- 一旦不相等了,从左到右第一个不相等位置的索引值就是缺失的数字的值
- 所以我们使用二分法查找第一个索引值和数组的值不相等的位置,此时索引值就是我们要的结果了
代码
class Solution { public int missingNumber(int[] nums) { int length = nums.length; int start = 0; int end = length - 1; while (start <= end) { int mid = start + (end - start) / 2; // 索引值和该位置的值不相等,说明有可能该位置的索引值就是缺失的数字的值 if (nums[mid] != mid) { // 如果该位置是缺失的位置,那么mid要么为第一个元素,要么前一个元素的值和索引值相等 if (mid == 0 || nums[mid-1] == mid-1) { // 找到 return mid; } else { // 如果不是缺失的值,那么说明还在左边,于是继续二分查找左边 end = mid - 1; } } else { // 相等的情况下,我们二分查找右边的 start = mid + 1; } } // 如果找了一圈,都没有缺失,那么start就会等于length,此时返回length的值就好 if (start == length) { return length; } return -1; } }
复杂度分析
- 时间复杂度:O(logN)
- 空间复杂度:O(1)
相关文章推荐
- 剑指Offer LeetCode 面试题53 - II. 0~n-1中缺失的数字
- 【Golang】LeetCode-剑指Offer-面试题53 - II-0~n-1中缺失的数字【四种解法】
- 【leetcode-python】剑指 Offer 53 - II. 0~n-1中缺失的数字
- 我要失业了 剑指offer 53 - II. 0~n-1中缺失的数字
- 剑指Offer面试题53:在排序数组中查找数字
- 数组中的重复(缺失)数字 剑指offer3 及扩展
- 力扣 - 剑指 Offer 57. 和为s的两个数字
- 剑指Offer LeetCode 面试题53 - I. 在排序数组中查找数字 I
- 剑指offer之0~n-1中缺失的数字(C++/Java双重实现)
- 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列
- 【剑指offer】面试题 53:数字在排序数组中出现的次数
- (C++)剑指offer-拓展:0到n-1中缺失的数字(时间效率)
- 剑指offer(53):数组中重复的数字
- 剑指Offer-53:在排序数组中查找数字
- 剑指Offer_53 在排序数组中查找数字
- 面试题53 - II. 0~n-1中缺失的数字/ 面试题54. 二叉搜索树的第k大节点/ 面试题55 - I. 二叉树的深度
- 力扣 - 剑指 Offer 11. 旋转数组的最小数字
- 【剑指Offer】II. 数组中数字出现的次数 II
- 【leetcode-python】剑指 Offer 53 - I. 在排序数组中查找数字 I
- 剑指offer--面试题53 在排序数组中查找数字(二分)