0-n-1中缺失的数字-算法总结笔记

Bug制造机
• 阅读 213

算法题目

0-n-1中缺失的数字

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

示例 1:

输入: [0,1,3]
输出: 2

示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

限制:
1 <= 数组长度 <= 10000

测试用例

[1] [0,1,3] [0,1,2] [1,2,3] [0,1,2,3,4,5,6,7,9]

思路分析

解法一:直接遍历

思路:由于数组的递增有序,并且求出缺失的数字,那么直接判断当前数字是否等于前面一个数字+1,
​ 否则就返回缺失数字
分析:时间复杂度为O(n),空间复杂度为O(1)
思考:缺失的数字主要在数组头部,中间,尾部,注意这三个位置来编代码。

解法二:二分法

思路:由于数组是排好序的,可以使用二分法,比较中间元素和序号是否相同,然后改变查找空间继续
​ 判断。
分析:时间复杂度为O(logn),空间复杂度为O(1)

/**

@author cosefy

@date 2020/6/25
*/
public class MissingNumber {
public static void main(String[] args) {
    int[] nums = {0, 1, 2, 3, 5};
    int res1 = test1(nums);
    System.out.println("解法一的结果是: " + res1);
    int res2 = test2(nums);
    System.out.println("解法二的结果是: " + res2);
}
//解法一:直接遍历
public static int test1(int[] nums) {
    int prenum = -1;
    for (int num : nums) {
        if (num != ++prenum) {
            return prenum;
        }
    }
    return prenum + 1;   //当数组元素缺失在尾部时,返回prenum+1
}
//解法二:二分法
public static int test2(int[] nums) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = (right + left) / 2;
        if (mid == nums[mid]) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left;
}
}
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
Jacquelyn38 Jacquelyn38
4年前
这些JS工具函数够你用到2020年底了
前言活不多说,自己平时搜集的干货函数奉上。干货函数找出数字在数组中下一个相邻的元素let i  "";let rr  ;const name  (n, arr1)    let num  Number(n);    for (let i  0; i < arr1.length; i)         const elemen
Wesley13 Wesley13
3年前
JAVA 中数组的几种排序方法
1、数组的冒泡排序publicvoidbubbleSort(inta){intna.length;for(inti0;i<n1;i){for(intj0;j<n1;j)
Stella981 Stella981
3年前
Leetcode No.39 组合总和
此文转载自:https://blog.csdn.net/jxq0816/article/details/113079141commentBox一、题目描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
JS一个算法题
题目:实现超出整数存储范围的两个大整数想加function(a,b)。注意:参数a和b以及函数返回值都是字符串。目的:考算法,基本逻辑。我实现的基本思路是:①两个数字字符串长度补成一样,用字符串'0’补位,比如a'1111',b'22',b用'0'补位成'0022'.②分3中情况处理,初始值的长度比较,,a的长度大于b的长度,b的长
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Stella981 Stella981
3年前
JavaScript基础知识
题目:1.找出数字数组中最大的元素(使用Math.max函数)2.转化一个数字数组为function数组(每个function都弹出相应的数字)3.给object数组进行排序(排序条件是每个元素对象的属性个数)4.利用JavaScript打印出Fibonacci数(不使用全局变量)5.实现如下语法的功能:vara(5).plus(
Stella981 Stella981
3年前
HDOJ 2100 Lovekey
ProblemDescriptionXYZ26进制数是一个每位都是大写字母的数字。A、B、C、…、X、Y、Z分别依次代表一个0~25的数字,一个n位的26进制数转化成是10进制的规则如下A0A1A2A3…An1的每一位代表的数字为a0a1a2a3…an1,则该XYZ26进制数的10进制值就为m=a0\26
小万哥 小万哥
1年前
C++ 用户输入与数据类型详解:建立基本计算器及变量类型
C用户输入你已经学习了cout用于输出(打印)值。现在我们将使用cin来获取用户输入。cin是一个预定义变量,它使用提取运算符()从键盘读取数据。在下面的示例中,用户可以输入一个数字,该数字存储在变量x中。然后我们打印x的值:示例cppintx;cou
贾蔷 贾蔷
2星期前
蓝桥杯2023接龙数列(洛谷P9242)题解:动态规划与数字首尾匹配的完美应用
一、题目解读这道蓝桥杯省赛真题要求找出数字序列中最长的接龙子序列(每个数字的首位等于前一个数字的末位),并计算需要删除的最少数字个数。题目考察动态规划的实际应用能力,是理解数字特征处理和状态转移的典型案例。二、解题步骤1.处理n1的特殊边界情况2.读取输入
Bug制造机
Bug制造机
Lv1
江南可采莲,莲叶何田田!
文章
4
粉丝
0
获赞
0