**劍指offer-70-53 0-n-1中缺失的數字
阿新 • • 發佈:2019-02-03
如果原來的陣列無序,那麼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(); } };