如果原来的数组无序,那么hash O(n)
https://www.lintcode.com/problem/missing-number/description
class Solution {
public:
/**
* @param nums: An array of integers
* @return: An integer
*/
int findMissing(vector<int> &nums) {
// if (nums[nums.size()-1] == nums.size() - 1) return nums.size();
// int l = 0, r = nums.size() - 1, mid = 0;
// while (l < r) {
// mid = l + (r - l) >> 1;
// if (nums[mid] != mid && ( mid == 0 || (mid && nums[mid - 1] == mid - 1 ) )) return mid;
// if (nums[mid] == mid) {
// l = mid + 1;
// } else {
// r = mid - 1;
// }
// }
// return l;
vector<int> hash(nums.size() + 1, 0);
for (int i = 0; i < nums.size(); i++) {
hash[ nums[i] ] = 1;
}
for (int i = 0; i < nums.size(); i++) {
if (!hash[i] ) return i;
}
return nums.size();
}
};
如果原来的数组有序
二分 O(log n) 停止条件是l<=r,如果只是l < r 相当于默认l == r的时候一定是符合条件的.... 可以在看下书P267的代码
int findMissing(vector<int> &nums) {
// if (nums[nums.size()-1] == nums.size() - 1) return nums.size();
int l = 0, r = nums.size() - 1, mid = 0;
while (l <= r) {
mid = l + (r - l) >> 1;
if (nums[mid] != mid && ( mid == 0 || (mid && nums[mid - 1] == mid - 1 ) )) return mid;
if (nums[mid] == mid) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return l;
// vector<int> hash(nums.size() + 1, 0);
// for (int i = 0; i < nums.size(); i++) {
// hash[ nums[i] ] = 1;
// }
// for (int i = 0; i < nums.size(); i++) {
// if (!hash[i] ) return i;
// }
// return nums.size();
}
};