Missing Number

本文介绍了一种在O(N)时间复杂度和O(1)空间复杂度下查找非负整数数组中缺失数字的方法。通过巧妙地利用数组本身作为映射表来标记已存在的数值,从而避免使用额外空间。

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

题意:从一组非负整数中找出缺少的数,比如[0,1,3],缺少2

要求:时间复杂度O(N),空间复杂度O(1)

思考路线:

1) 第一想法是对数组排序,然后遍历一遍,但是时间复杂度O(nlogn),不满足要求;

2) 接着想用map做,可以做到时间复杂度O(N),但是空间复杂度O(N),不满足要求;

3) 针对第二个想法,由于不能用额外的空间存储,想到只能用目前已有的数组做map了,

      即数组既要能够保存原有数组的信息,又能实现map的功能


思路:数组实现map功能,当然是数组下标做Key,数组元素做value。怎样表明数字存在,没有missing?若用额外的map做的话,我们会将map[key] 置为 1,这里我们将nums[key]置为其原有置为 -1 * nums[key],这样在后面遍历的时候,可以通过乘上-1还原原数组的信息;第二次遍历,找到第一个不为负的数,即为missing的数字。

注意坑:对0的操作,由于乘上-1还为0,所有对于,要单独用标志。


代码:

public class Solution {
    public int missingNumber(int[] nums) {
        if(nums == null || nums.length == 0)
            return 0;
        int flag = -1 * Integer.MAX_VALUE;
        for(int i = 0; i < nums.length; i++) {
            int index;
            if(nums[i] <= 0) {
                index = nums[i] * -1;
            } else {
                index = nums[i];
            }
            if(index == -1 * flag)
            	index = 0;
            if(index < nums.length) {
            	if(nums[index] == 0) {
            		nums[index] = flag;
            	} else {
                    nums[index] = -1 * nums[index];
            	}
            }
        }
        int j = 0;
        for(j = 0; j < nums.length; j++) {
        	if(nums[j] >= 0) {
        		break;
        	}
        }
        return j;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值