力扣之数组二分法

二分法

以后开始跟着carl刷题了,要格外注意代码格式规范问题了,之前写的都粘在在了一起。
第一篇:数组二分法:

第一题:704. 二分查找

力扣之数组二分法_第1张图片

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size()-1, mid;
        while(l<=r){
            mid = l+(r-l)/2;
            if (nums[mid] == target)
                return  mid;
            else if(nums[mid] > target)
                r = mid - 1; 
            else 
                l = mid + 1;                
        }
        return -1;
    }
};

力扣之数组二分法_第2张图片

//递归实现二分法:
int binary_search( int arr[], int l, int r, int x) {
    if (r >= l) {
        int mid = l + (r - l) / 2;
        if (arr[mid] == x)
            return mid;
        if (arr[mid] > x)
            return binary_search(arr, l, mid - 1, x);
        return binary_search(arr, mid + 1, r, x);
    }
    return -1;
}

第二题:35. 搜索插入位置

力扣之数组二分法_第3张图片

class Solution {
public:
    int searchInsert(vector<int>& nums, int target){
        if(target > nums[nums.size()-1])
            return nums.size();
        int l = 0, r =nums.size()-1,mid;
        while(l < r){
            mid = l + (r - l) / 2;
            if(nums[mid] < target){
                l = mid + 1;                
            }
            else{  
                r = mid;
            }
        }
        return l;
    }
};

力扣之数组二分法_第4张图片

第三题:69. x 的平方根

力扣之数组二分法_第5张图片

/*class Solution {
    public int mySqrt(int x) {            
         if(x==0) return 0;
          if(x>0){
             return(int) Math.pow(x,0.5);
          }
         return -1; 
    }
};
*/
class Solution {
    public int mySqrt(int x) {
        int l = 0, r = x, mid;
        int result = -1;

        while(l <= r){
            mid = l + (r - l) / 2;
            if((long)mid * mid <= x){
                result = mid;
                l = mid + 1;
            }
            else{
                r = mid - 1;
            }
        }
        return result;
    }
}

力扣之数组二分法_第6张图片

第四题:367.有效的完全平方数

力扣之数组二分法_第7张图片

class Solution {
public:
    bool isPerfectSquare(int x) {
        int l = 0, r = x-1, ans = -1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if ((long)mid * mid == x || x==1) {
                return true;
            } else if((long)mid * mid <= x)  {
                l = mid + 1;
            }else{
                r = mid - 1;
            }
        }
        return false;
    }
};

力扣之数组二分法_第8张图片

你可能感兴趣的:(leecode)