class Solution {
public int missingNumber(int[] nums) {
int left = 0;
int right = nums.length -1;
while (left <= right){
int mid = (right - left) / 2 +left;
// 如果相等 说明“右子数组的首位元素”一定在[mid+1,right]
if (nums[mid] == mid){
left = mid + 1;
// 如果不相等 说明“左子数组的末位元素”一定在[left,mid-1]
}else {
right = mid - 1;
}
}
return left;
}
}
c++ 二分查找
lass Solution {
public:
int missingNumber(vector& nums)
{
int r=nums.size()-1,i;
int l=0;
while(l<r)
{
int mid=(r-l)/2+l;
if(nums[mid]!=mid)
r=mid;
else
l=mid+1;
”’java
class Solution {
public int missingNumber(int[] nums) {
int l = 0;
int r = nums.length – 1;
if(nums[0] > 0){
return 0;
}
while(l < r){
int mid = (l + r + 1)/2;
if(nums[mid] > mid){
r = mid – 1;
}else{
l = mid;
}
}
return l + 1;
}
}
时间复杂度O(logn)
空间复杂度O(1)
”’
class Solution {
public int missingNumber(int[] nums) {
// 简单方法:即遍历数组,找到下标和值不相等的那个值
// 进阶:二分查找,数组分为两部分,前半部分下标和值相等,后半部分下标和值不相等
// 找到后半部分的第一个坐标
int left = 0;
int right = nums.length-1;
int mid;
while(left<=right){
mid = (right-left)/2+left;
if(mid==nums[mid]){
left = mid + 1;
} else{
right = mid-1;
}
}
return left;
}
}
class Solution {
public int missingNumber(int[] nums) {
int len = nums.length;
int n = len+1;
int ans=0;
boolean[] isPresent = new boolean[n];
Arrays.fill(isPresent, false);
for(int i=0;i<len;i++) {
isPresent[nums[i]]=true;
}
for(int i=0;i<n;i++) {
if(isPresent[i]==false) {
ans=i;
}
}
return ans;
}
}
func missingNumber(nums []int) int {
left, right := 0, len(nums) - 1
for left <= right {
mid := left + (right-left)/2
if nums[mid] > mid {
right = mid - 1
} else {
left = mid + 1
}
}
return left
}
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;
}
}
return nums[left]==left?left+1:left;
}
}
class Solution {
public int missingNumber(int[] nums) {
//二分 找到左边开始第一个不与下标相等的第一个元素
//左边等于下边 右边不等于 左边开始走 反正左边一直往右走
int left =0;
int right = nums.length-1;
int mid;
// 最拉跨的方法
class Solution {
public int missingNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i <= nums.length; i++) {
map.put(i, i);
}
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.remove(nums[i]);
}
}
for (Integer value : map.values()) {
return value;
}
return -1;
}
}
class Solution {
public int missingNumber(int[] nums) {
int l=0,r=nums.length-1;
while(l<=r){
//l寻找第一个不符合条件的数的位置
//r寻找符合条件的最后一个数的位置
int mid=(r-l)/2+l;
if(nums[mid]==mid){
l=mid+1;
}else{
r=mid-1;
}
}
return l;
}
}
class Solution {
public int missingNumber(int[] nums) {
//n - 1 == nums.length;
int i = 0, j = nums.length - 1;
while(i <= j){
int m = (i + j) >> 1;
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 = l + r >> 1;
if(nums[mid] > mid) r = mid - 1;
else if(nums[mid] <= mid) l = mid + 1;
}
return l;
}
}
共以下 23 个回答
class Solution {& nums) {
public:
int missingNumber(vector
int len = nums.size();
int left = 0;
int right = len;
};//滴滴
时间复杂度:O(logN)
“`c++& nums) {
//时间复杂度: O(logn)
//空间复杂度: O (n)
class Solution {
public:
int missingNumber(vector
int n=nums.size();
int l=0,r=n-1;
while(l<=r) { int m=l+(r-l)/2; if(nums[m]==m) l=m+1; else { while(m>=0&&nums[m]!=m) m–;
return m+1;
}
}
return n;
}
};
c++ 二分查找& nums)
lass Solution {
public:
int missingNumber(vector
{
int r=nums.size()-1,i;
int l=0;
while(l<r)
{
int mid=(r-l)/2+l;
if(nums[mid]!=mid)
r=mid;
else
l=mid+1;
};
时间复杂度: O(logn)
空间复杂度: o (n)
”’java
class Solution {
public int missingNumber(int[] nums) {
int l = 0;
int r = nums.length – 1;
if(nums[0] > 0){
return 0;
}
while(l < r){
int mid = (l + r + 1)/2;
if(nums[mid] > mid){
r = mid – 1;
}else{
l = mid;
}
}
return l + 1;
}
}
时间复杂度O(logn)
空间复杂度O(1)
”’
二分找缺失。时间O(logn)
时间复杂度:O(logn)
空间复杂度:O(1)
比较拉跨的方法
代码
class Solution {
public int missingNumber(int[] nums) {
//二分 找到左边开始第一个不与下标相等的第一个元素
//左边等于下边 右边不等于 左边开始走 反正左边一直往右走
int left =0;
int right = nums.length-1;
int mid;
没想到利用下标和value相等
比较恶心的是一个测试案例的,所以搜索范围要扩大一点
7.22
Day14:下面是代码
正常情况下,也就是不缺失的情况下,nums[i] 和 其下标i 是一一对应的,因为缺失,而造成有一个地方是不对应的,我们需要找到这个地方。
此时就可以把二分思想中的target想成下标值,想清楚这个,就和一般的二分题毫无区别了。