二分模板

62. Search in Rotated Sorted Array

先看是否反序,再分6种情况讨论

  1. class Solution {
  2. public:
  3. /**
  4. * @param A: an integer rotated sorted array
  5. * @param target: an integer to be searched
  6. * @return: an integer
  7. */
  8. int search(vector<int> &A, int target) {
  9. // write your code here
  10. if (A.size() == 0){
  11. return -1;
  12. }
  13. int left = 0, right = A.size() - 1;
  14. while(left + 1 < right){
  15. int mid = left + (right - left) / 2;
  16. if (A[left] < A[right]){
  17. if (A[mid] < target){
  18. left = mid;
  19. }else{
  20. right = mid;
  21. }
  22. }else{
  23. if ((A[mid] < target && target < A[0]) || (A[mid] >= A[0] && A[mid] < target) || (A[mid] > A[left] && A[left ] > target)){
  24. left = mid;
  25. }else{
  26. right = mid;
  27. }
  28. }
  29. }
  30. if (A[left] == target){
  31. return left;
  32. }else if (A[right] == target){
  33. return right;
  34. }else{
  35. return -1;
  36. }
  37. }
  38. };

460. Find K Closest Elements

int low = lower_bound(A.begin(),A.end(),target) - A.begin();

  1. class Solution {
  2. public:
  3. /**
  4. * @param A: an integer array
  5. * @param target: An integer
  6. * @param k: An integer
  7. * @return: an integer array
  8. */
  9. vector<int> kClosestNumbers(vector<int> &A, int target, int k) {
  10. // write your code here
  11. //int i = 0, end = A.size() - 1;
  12. int low = lower_bound(A.begin(),A.end(),target) - A.begin();
  13. //cout << low;
  14. int pos = 0;
  15. vector <int> res;
  16. if (low > 0 && A[low] - target > target - A[low - 1]){
  17. pos = low - 1;
  18. }else{
  19. pos = low;
  20. }
  21. if (pos == 0){
  22. vector <int> res(A.begin(), A.begin() + k);
  23. return res;
  24. }else if(pos == A.size() || pos == A.size() - 1){
  25. vector <int> res(A.end() - k, A.end());
  26. reverse(res.begin(), res.end());
  27. return res;
  28. }
  29. else{
  30. int left = low - 1, right = low, count = 0;
  31. while(left >= -1 && right <= A.size() && count < k){
  32. if (left == -1){
  33. res.push_back(A[right]);
  34. right ++;
  35. }else if (right == A.size()){
  36. res.push_back(A[left]);
  37. left --;
  38. }else{
  39. if (A[right] - target >= target - A[left]){
  40. res.push_back(A[left]);
  41. left --;
  42. }else{
  43. res.push_back(A[right]);
  44. right ++;
  45. }
  46. }
  47. count ++;
  48. }
  49. }
  50. return res;
  51. }
  52. };

140. Fast Power

计算机计算在一个较大的容器中进行,最后再进行截取。

class Solution {
public:
    /**
     * @param a: A 32bit integer
     * @param b: A 32bit integer
     * @param n: A 32bit integer
     * @return: An integer
     */
    int fastPower(int a, int b, int n) {
        // write your code here
        int temp = n;
        a = a % b;
        long powNow = a;

        long res = 1;
        if (b == 1){
            return 0;
        }
        if (n == 0){
            return 1;
        }
        while(temp != 0){
            if (temp % 2 == 1){
                //cout << temp << endl;
                temp --;
                //cout << powNow << endl;
                res = (res * powNow) % b;
                //cout << res << endl;
                // powNow *= a;

            }
            powNow = (powNow * powNow) % b;
            //powNow = powNow % b;
            temp /= 2;
        }
        return res;
    }
};

141. Sqrt(x)

class Solution {
public:
    /**
     * @param x: An integer
     * @return: The sqrt of x
     */
    int sqrt(int x) {
        // write your code here
        long left = 1, right = x;
        while(left + 1 < right){
            long mid = left + (right - left)/2;
            if(x > mid * mid){
                left = mid;
            }else if (x < mid * mid){
                right = mid;
            }else{
                return mid;
            }
        }
        if (right * right <= x){
            return right;
        } 
        return left;
    }
};

586. Sqrt(x) II

class Solution {
public:
    /**
     * @param x: a double
     * @return: the square root of x
     */
    double sqrt(double x) {
        // write your code here
        double left = 0, right = max (1.0, x);
        double eps = 1e-12;
        while (left + eps < right){
            double mid = left + (right - left) / 2;
            if (mid * mid < x){
                left = mid;
            }else {
                right = mid;
            }

        }
        if (right * right < x){
                return right;
            }
        return left;
    }
};

617. Maximum Average Subarray II

#include <float.h>
class Solution {
public:
    /**
    * @param nums: an array with positive and negative numbers
    * @param k: an integer
    * @return: the maximum average
    */

    bool isRight(double res, vector <int> nums, int k) {
        vector <double> newNums(nums.size());
        vector<double> preSum(nums.size(), DBL_MAX);
        vector <double> minPreSum(nums.size());
        newNums[0] = nums[0] - res;
        preSum[0] = nums[0] - res;
        minPreSum[0] = nums[0] - res;
        for (int i = 1; i < nums.size(); i++) {
            newNums[i] = nums[i] - res;
            preSum[i] = preSum[i - 1] + newNums[i];
            minPreSum[i] = min(preSum[i], minPreSum[i - 1]);
            //cout << minPreSum[i] << ' ' << res << endl;
        }
        if (preSum [k - 1] > 0){
            return true;
        }
        for (int i = k; i < nums.size(); i++) {
            if (preSum[i] - minPreSum[i - k] > 0 || preSum[i] > 0) {
                return true;
            }
        }
        return false;
    }
    double maxAverage(vector<int> &nums, int k) {
        // write your code here
        if (nums.size() == 0) {
            return 0.0;
        }
        double accuracy = 1e-4;
        int minimum = nums[0], maximum = nums[0];
        for (int i = 0; i < nums.size(); i++) {
            minimum = min(minimum, nums[i]);
            maximum = max(maximum, nums[i]);
        }
        double start = minimum, end = maximum;
        while (start + accuracy < end) {
            double mid = start + (end - start) / 2;
            if (isRight(mid, nums, k)) {
                start = mid;
            }
            else {
                end = mid;
            }
        }
        return end;
    }
};

437. Copy Books

class Solution {
public:
    /**
     * @param pages: an array of integers
     * @param k: An integer
     * @return: an integer
     */

    bool isExist(vector<int> &pages, int k, int tempRes){
        int pointer = 0;
        for (int i = 0; i < k; i ++){
            if (pointer == pages.size()){
                return true;
            }
            int perRes = 0;
            while (perRes + pages[pointer] <= tempRes){
                perRes += pages[pointer];
                pointer ++;
                if (pointer == pages.size()){
                    return true;
                }
            }
        }
        return false;
    }
    int copyBooks(vector<int> &pages, int k) {
        // write your code here
        int tempRes = 0;
        int sum = 0;
        int start = 0;
        for (int i = 0; i < pages.size(); i ++){
            sum = sum + pages[i];
        }
        int end  = sum;
        while (start + 1 < end){
            int mid = start + (end - start) / 2;
            //cout << mid << endl;
            if (isExist(pages, k, mid)){
                end = mid;
            }else{
                start = mid;
            }
        }
        if (isExist(pages, k, start)){
            return start;
        }
        return end;
    }
};

633. Find the Duplicate Number

class Solution {
public:
    /**
     * @param nums: an array containing n + 1 integers which is between 1 and n
     * @return: the duplicate one
     */
    int findDuplicate(vector<int> &nums) {
        // write your code here
        vector <int> newVec = nums;
        sort(newVec.begin(), newVec.end());
        int start = 0, end = nums.size() - 1;
        while (start + 1 < end){
            int mid = start + (end - start) / 2;
            cout << mid << endl;
            if (newVec[mid] * 2 >= (newVec[start] + newVec[end])){
                start = mid;
            }else{
                end = mid;
            }
        }
        return newVec[start];

    }
};

438. Copy Books II

class Solution {
public:
    /**
     * @param n: An integer
     * @param times: an array of integers
     * @return: an integer
     */
    bool isExist(int n, vector<int> & times, int temp){
        int res = 0;
        for (int i = 0; i < times.size(); i ++){
            res += temp / times[i];
        }
        if (res >= n){
            return true;
        }
        return false;
    }
    int copyBooksII(int n, vector<int> &times) {
        // write your code here

        int temp = 0, end = INT_MAX;
        for (int i = 0; i < times.size(); i ++){
            end = min(end, times[i]);
        }
        end = end * n;
        int start = 0;
        while (start + 1 < end){
            int mid = start + (end - start) / 2;
            if (isExist(n, times, mid)){
                end = mid;
            }else{
                start = mid;
            }
        }
        if (isExist(n, times, start)){
            return start;
        }
        return end;
    }
};

183. Wood Cut

class Solution {
public:
    /**
     * @param L: Given n pieces of wood with length L[i]
     * @param k: An integer
     * @return: The maximum length of the small pieces
     */
    bool isExist(vector<int> &L, int k, int mid){
        int res = 0;
        for (int i = 0; i < L.size(); i ++){
            res += L[i] / mid;
        }
        if (res >= k){
            return true;
        }
        return false;
    }
    int woodCut(vector<int> &L, int k) {
        // write your code here
        int start = 0, end = 0;
        for (int i = 0; i < L.size(); i ++){
            end = max(end, L[i]);
        }
        while(start + 1 < end){
            int mid = start + (end - start) / 2;
            if (isExist(L, k, mid)){
                start = mid;
            }else{
                end = mid;
            }
        }
        if (isExist(L, k, end)){
            return end;
        }
        return start;
    }
};