看了一些题解都是hash或者排序、划分的解法,时间和空间复杂度都不满足要求。这里给一个时间复杂度O(n),空间复杂度O(1)的解法。
其实这个题目不太严谨,本质上是一个简单的数学问题。应该再加上一个条件:加上这个缺失的最小整数后,它是一个连续数组(不包括0)。
不知道是不是以为这个原因,很多朋友没有这么去想。
如果是连续数组,这个问题就简单多了:
我们先求出数组和,然后再计算出[min, max]连续区间的和。差值就是缺少的那个正数。
处理一下相等的情况就可以了。
class Solution { public: /** * return the min number * @param arr int整型vector the array * @return int整型 */ int minNumberdisappered(vector<int>& arr) { int lmin = arr[0], lmax = arr[0]; int sum1 = arr[0]; for(int i = 1; i < arr.size(); i++) { if(lmin > arr[i]) lmin = arr[i]; if(lmax < arr[i]) lmax = arr[i]; sum1 += arr[i]; } int sum2 = 0; for(int i = lmin; i <= lmax; i++) sum2 += i; int loss = sum2 - sum1 == 0 ? lmax+1 : sum2 - sum1; return max(1, loss); } };