class Solution {
public int missingNumber(int[] nums) {
int l = 0;
int r = nums.length - 1;
while(l < r){
int mid = (r - l) / 2 + l;
if(nums[mid] == mid){
l = mid + 1;
}else{
r = mid;
}
}
return nums[r] == r ? r + 1 : r;//如果数组完整证明缺少最后一个元素
}
}
class Solution {
public int missingNumber(int[] nums) {
int l = 0, r = nums.length - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] == mid) l = mid + 1;
else r = mid;
}
return nums[l] != l ? l : nums.length;
}
}
class Solution {
// 排序数组中的搜索问题,首先想到 二分法 解决。
// 排序数组中使用双指针也是高频选项
/*
根据题意,数组可以按照以下规则划分成两部分
左子数组:nums[i] == i
右子数组:nums[i] != i
缺失的数字等于“右子数组的首位元素”,也就是在 判断条件 为nums[i] != i,求其左边界
*/
public int missingNumber(int[] nums) {
int l = 0;
int r = nums.length;
while(l < r)
{
int mid = l + r>> 1;
if(nums[mid] != mid) r = mid;
else l = mid + 1;
}
return l;
}
}
class Solution {
public:
int missingNumber(vector<int>& nums) {
//使用二分查找,左闭右开
int l= 0;
int r = nums.size();
while(l<r){
int m = l+(r-l)/2;
if(nums[m]>m) r = m;
else if(nums[m]==m) l = m+1;
}
return l;
}
};
func missingNumber(nums []int) int {
if len(nums) == 0 {
return -1
}
l := 0
r := len(nums) - 1
var mid int
for l <= r {
mid = l + (r - l) / 2
if nums[mid] != mid {
r = mid - 1
}else{
l = mid + 1
}
}
return l
}
class Solution:
def missingNumber(self, nums: List[int]) -> int:
for i in range(len(nums)):
if nums[i]!=i:
return i
return len(nums)
二分查找
时间 O(logn) 空间 O(1)
class Solution:
def missingNumber(self, nums: List[int]) -> int:
i, j = 0, len(nums) - 1
while i <= j:
m = (i + j) // 2
if nums[m] == m: i = m + 1
else: j = m - 1
return i
class Solution {
public int missingNumber(int[] nums) {
for (int i = 0; i < nums.length; i ++) {
if (nums[i] != i) {
return i;
}
}
return nums.length;
}
}
class Solution {
public:
int missingNumber(vector<int> nums) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
const auto mid = left + (right - left) / 2;
const auto tmp = nums[mid];
if (tmp > mid) {
right = mid - 1;
} else if (tmp == mid) {
left = mid + 1;
} else if (tmp < mid) {
left = mid + 1;
}
}
return left;
}
}
class Solution {
public int missingNumber(int[] nums) {
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] > mid){
right = mid - 1;
}else{
left = mid + 1;
}
}
return left;
}
}
class Solution:
def missingNumber(self, nums: List[int]) -> int:
if not nums or nums[0]!=0: return 0
if nums[-1]!=len(nums):return len(nums)
if len(nums)==2 and nums[-1]==len(nums):return 1
left ,right= 0,len(nums)-1
scan = nums[0]+nums[-1]
while (left<=right):
if nums[left]+nums[right]>scan:
return nums[left]-1
elif nums[left]+nums[right]<scan:
return nums[right]+1
else:
right = right-1
left = left+1
class Solution {
public int missingNumber(int[] nums) {
int l = 0;
int r = nums.length - 1;
while(l <= r) {
int mid = l + (r-l)/2;
if(mid == nums[mid]) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
return l;
}
}
class Solution {
//使用二分查找法,若中间节点的值发生异常则将右标记往前移,无异常则左标记往后移
public int missingNumber(int[] nums) {
if(nums == null||nums.length==0)return 0;
int l = 0,r = nums.length - 1;
int m = 0;
while(l != r){
m = (l+r)/2;
if(nums[m] == m){
l = m + 1;
}else
r = m;
}
return l==nums[l] ? nums.length : l;
}
}
class Solution {
public int missingNumber(int[] nums) {
int left = 0,right = nums.length-1;
while(left<=right){
int mid = (right-left)/2+left;
if(nums[mid] == mid){
left = mid+1;
}else{
right = mid-1;
}
}
return left;
}
// int num = 1;
// for(int i = 0;i<nums.length;i++){
// if(i!=nums[i])return i;
// return nums.length;
// }}
}
class Solution {
public int missingNumber(int[] nums) {
int i = 0, j = nums.length - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] == m) i = m + 1;
else j = m - 1;
}
return i;
}
}
class Solution {
public int missingNumber(int[] nums) {
int l = 0, r = nums.length - 1;
while (l < r) {
int mid = (r - l) / 2 + l;
if (nums[mid] == mid) {
l = mid + 1;
} else {
r = mid;
}
}
return nums[l] == l ? l + 1 : l;
}
}
class Solution {
public int missingNumber(int[] nums) {
int left = 0;
int right =nums.length-1;
while(left<=right){
int mid = (right-left)/2+left;
if(nums[mid]==mid){
left=mid+1;
}else{
right=mid-1;
}
}
return left;
}
}
class Solution {
public int missingNumber(int[] nums) {
int left = 0;
int right = nums.length - 1;
while(left < right){
int mid = left + (right - left)/2;
if(nums[mid] == mid){
left = mid + 1;
}else{
right = mid;
}
}
return nums[right] == right ? right+1:right;
}
}
class Solution {
public int missingNumber(int[] nums) {
if (nums[0]==1) return 0;
for (int i = 0;i<nums.length;i++){
//只要比较数组下标和该下标对应的值即可,再排除缺失0和缺失最后一项两个特殊情况。
if (nums[i]!=i) return i;
}
return nums.length;
}
}
class Solution:
def missingNumber(self, nums: List[int]) -> int:
i, j = 0, len(nums) - 1
while i <= j:
m = (i + j) // 2
if nums[m] == m:
i = m + 1
else:
j = m - 1
return i
class Solution {
public int missingNumber(int[] nums) {
int n = nums.length;
int l = 0;
int r = n-1;
while(l<r){
int mid = (l+r)/2;
if(nums[mid] == mid){
l = mid+1;
}else{
r = mid;
}
}
if(nums[l] == l) return l+1;
return l;
}
}
共以下 38 个回答
自己做的时候没有想到return还要区分
时间O(logN)空间O(1)
时间复杂度:log(n)
额外空间复杂度:O(1)
时间复杂度:O(logn)
零件复杂度:O(1)
直接遍历:
时间 O(n) 空间 O(1)
二分查找
时间 O(logn) 空间 O(1)
思路一:定义一个变量i=0,拿i和nums[i]做比较,相等i++,否则返回i。时间复杂度O(N),空间复杂度O(1)。
思路二:对0到n-1之间的数求和,然后对nums数组中所有的数求和,得到的差值就是缺失的那个数字,时间复杂度O(N),空间复杂度O(1)。
思路三:通过二分的思想不断的缩小范围。时间复杂度O(N),空间复杂度O(1)。
时间复杂度:O(lgN)
思路:二分查找
时间复杂度 O(logN)
**空间复杂度 O(1) **
规律:nums[mid] > mid 说明元素在左边,缩小右边边界;反之,元素在右边,缩小左边边界
//有升序数组二分查找& nums) {
class Solution {
public:
int missingNumber(vector
int l=0,r=nums.size()-1;
int res=-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]mid) l=mid+1;
else r=mid-1;
}
res=l;
return res;
}
};
想到了加法求和,先把左右边界控制了,则数组内左+右=nums[0]+nums[-1],二分遍历,大于总值,说明左边缺数,反之亦然
时间复杂度O(logn)
空间复杂度O(1)
左闭右闭
空间复杂度O(1)
时间复杂度O(logn)
空间复杂度O(1)
时间复杂度O(logn)
本来想用别的方法做的,还是用了二分查找,自己画的图
下面是代码
找到与nums[mid]不想等的索引就可以判断,一定存在这个数
时间:O(log(n)),空间:O(1)
时间复杂度为O(logn),空间复杂度为O(1)
使用二分查找,注意最终的返回值
时间复杂度为O(lgn),空间复杂度为O(1)
log(n)
二分查找
时间复杂度 O logn
时间O(n)
空间O(n)