缺失的数字 剑指offer 算法学习 Java

这篇博客探讨了一种长度为n-1的递增排序数组中找寻缺失数字的问题。文中提供了三种解决方案:利用索引关系、数学求和公式以及哈希表。每种方法都附带了详细的思路分析和示例,帮助读者理解如何在有序数组中快速找到缺失的元素。
摘要由CSDN通过智能技术生成

没啥好的笔记,就水一篇吧,还是记录一下今天写的题目咯

题目:

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

思路与分析:最好的消息是数组是递增的,也就省略排序啦,就可以很容易的看出时间复杂度了;数组长度与数组元素差1,而且递增,那么就可以想到索引与元素值得关系咯,将数组元素一遍历就能能找到除数组长度值的以外缺失元素的例子,那么遍历元素都无返回就可以直接返回数组长度即最大值啦

举个例子:

[0, 2] ==> 遍历数组元素时,发现索引为1时,数组元素值为2,不同,那么该数组就缺失了元素1,返回即可;

[0, 1] ==> 遍历数组元素都没有查出,即索引都能找到对应元素,此时就可以返回元素2,即数组长度啦;

class Solution {
    public int missingNumber(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < len; i++){
            if (i != nums[i]){
                return i;
            }
        }
        return len;
    }
}

思路与分析:

根据数学函数,可以求出0~n-1的和,关系式为:sum = n * (n - 1)  / 2 也就是数据求和;

按照数组长度求和的结果值与数组元素和的值的差就是缺失元素啦;

举个栗子:

[0, 1, 2, 4, 5] 长度求和:5 * 4 / 2 = 10 哎,是不是发现不对劲啦,对咯,求和函数式是0~n,而我们的数据只需要从0~n-1,那么此时的n就不是数组的长度咯,需要+1,即此时6 * 5 / 2 = 15;数组元素求和为0 + 1 + 2 + 4 + 5 = 12;差为3就是缺失的元素咯。

class Solution {
    public int missingNumber(int[] nums) {
       int len = nums.length;
       // 这里可以长度先加1,再使用求和式,也可以像我这样,后面再加1,效果一致哦
       int sum = len * (len + 1) / 2;
       int arrSum = 0;
       for (int i : nums){
           arrSum += i;
       }
       return sum -arrSum;
    }
}

思路与分析:

还可以通过哈希表,这个其实一般,在这里效果只能说不如上面两种,但是也可以解决,利用了Set集合的特性,值不重复。可以将数组元素先添加集合中,再遍历与数组等长的索引值循环,再通过contains(object o)进行判断,如果索引值已经在集合中,返回true,此元素不缺失,当返回false时,集合中不存在该元素意味着缺失了。
 

class Solution {
    public int missingNumber(int[] nums) {
       Set<Integer> set = new HashSet<>();
       int len = nums.length;
       for (int i = 0; i < len; i++){
           set.add(nums[i]);
       }
       for (int i = 0; i <= len; i++){
           if (!set.contains(i)){
               return i;
           }
       }
       // 这个返回值随您喜欢啦,上面代码不错的话,不需要到这里来的,但是又要return,所以随意啦
       return -1;
    }
}

水水水~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未满3岁

我爱你,你爱我,蜜雪冰城甜蜜蜜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值