桶---连续整数,找中间缺少的两个数

引言

    现在有1-N个连续整数,顺序被打乱了,但中间少两个数,请找到这两个数

思路

    1.有1-N个连续数组,中间少两个数,那么就准备一个N+2的boolean类型的数组桶
    2.把连续数组元素的作为桶的下坐标,把桶下坐标的值变为true

    3.从1开始循环boolean桶,把元素false的下坐标找出来,就是缺少的数

代码

public class FindMissedNumber {

    public static int[] findMissedNumber(int[] arr){
        if(null == arr || arr.length < 2) {
            return new int[] {-1,-1};
        }
        // 获取数组长度
        int len = arr.length;

        // 准备长度+2的桶
        boolean[] num = new boolean[len + 2];

        // 循环数组改变桶元素值
        for (int i = 0; i < len; i++) {
            num[arr[i]] = true;
        }

        //返回的缺少数的数组
        int[] miss = new int[3];
        // 素组下坐标
        int j = 0;

        // 从循环桶、找到是false的元素下坐标
        for(int i=1; i < num.length; i++){
            if(!num[i]){
                miss[j++] = i;
            }
        }
        return miss;
    }

    public static void main(String[] args) {
        int[] s =  new int[]{0,2,5,9,7,4,12,1,13,8,10,11};
        int[] ss = findMissedNumber(s);
        System.out.println(ss[0]+ "" + ss[1]);
    }

}
利用桶的原来,可以很好的解决这个问题,时间复杂度是O(N)。空间复杂度也是O(N),如果利用排序,那么时间空间复杂度会上升上去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值