【leetcode】数组篇刷题 --二分查找

*
 * @lc app=leetcode.cn id=704 lang=cpp
 *
 * [704] 二分查找
 */

// @lc code=start
class Solution {
public:
    int search(vector<int>& nums, int target) {
        
        int lp = 0;
        int rp = nums.size()-1;
        int middle;
        while(lp <= rp) {
            middle = lp + (rp - lp) / 2;
            if(target > nums[middle]) {
                lp = middle + 1;
            }else if(target < nums[middle]){
                rp = middle - 1;
            }else if(target == nums[middle]){
                return middle;
            }
        }
        return -1;
    }
};
/*
 * @lc app=leetcode.cn id=34 lang=cpp
 *
 * [34] 在排序数组中查找元素的第一个和最后一个位置
 */

// @lc code=start
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {

        //暴力解法
        //循环匹配,
     
        //初始化arr中两个元素均为-1
        vector<int> arr(2,-1);
        for (int i = 0; i < nums.size(); i++)
        {
            /* 加速执行(大于目标值,直接返回) */
            if(target < nums[i]){
                return arr;
            }

            //匹配到第一个target时,start与end索引均为此值的索引,
            //而后的匹配中,仅修改end索引
            if(target == nums[i]){
                if(arr[0] == -1){
                    arr[0] = i;
                    arr[1] = i;
                }else{
                    arr[1] = i;
                }
            }
            
        }
        return arr;

    }
};
// @lc code=end


/*
 * @lc app=leetcode.cn id=34 lang=cpp
 *
 * [34] 在排序数组中查找元素的第一个和最后一个位置
 */

// @lc code=start
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {

        //分别查找startIndex与endIndex
        int stratIndex = -1;
        int endIndex = -1;
        //左右指针
        int lp = 0;
        int rp = nums.size() - 1;
        int middle = 0;
        //找出startIndex
        while(lp <= rp) {
            middle = lp + (rp - lp) / 2;
            if(target < nums[middle]) {
                rp = middle - 1;
            } else if(target > nums[middle]) {
                lp = middle + 1;
            } else if(target == nums[middle]) {
                stratIndex = middle;
                //关键:找到一个target时,向左边移动rp,目的是在接下来的循环中找到并确认startIndex的最终值
                rp = middle - 1;  
            }
        }


        //找出endIndex
        lp = 0;
        rp = nums.size() - 1;
        while(lp <= rp) {
            middle = lp + (rp - lp) / 2;
            if(target < nums[middle]) {
                rp = middle - 1;
            } else if(target > nums[middle]) {
                lp = middle + 1;
            } else if(target == nums[middle]) {
                endIndex = middle;
                //找到一个target便将lp向右移动,以确认最终的endIndex
                lp = middle + 1;  
            }
        }
        return {stratIndex,endIndex};

    }
};
// @lc code=end


本题最终二分解法,二分复用版

/*
 * @lc app=leetcode.cn id=34 lang=cpp
 *
 * [34] 在排序数组中查找元素的第一个和最后一个位置
 */

// @lc code=start
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {

        //分别查找startIndex与endIndex
        int stratIndex = binarySerach(nums,target,false);
        int endIndex = binarySerach(nums,target,true);
        return {stratIndex,endIndex};

    }
    //将上文的找startIndex与endIndex两次二分进行了复用
    int binarySerach(vector<int>& nums, int target, bool turn) {
        int index = -1;
        //左右指针
        int lp = 0;
        int rp = nums.size() - 1;
        int middle = 0;
        //找出Index
        while(lp <= rp) {
            middle = lp + (rp - lp) / 2;
            if(target < nums[middle]) {
                rp = middle - 1;
            } else if(target > nums[middle]) {
                lp = middle + 1;
            } else if(target == nums[middle]) {
                index = middle;
                if(turn){
                    lp = middle + 1;
                }else{
                    rp = middle - 1;  
                }
                
            }
        }
        return index;
    }

    
};
// @lc code=end


/*
 * @lc app=leetcode.cn id=367 lang=cpp
 *
 * [367] 有效的完全平方数
 */

// @lc code=start
class Solution {
public:
    bool isPerfectSquare(int num) {

        //暴力,由1开始匹配
        long square = 1;
        long x = 1;
        //num的平方数的平方必定=num,当大于时则num不存在平方数
        while(square <= num){
            square = x * x;
            if(square ==  num){
                return true;
            }
            x++;
        }
        return false;

    }
};
// @lc code=end


/*
 * @lc app=leetcode.cn id=367 lang=cpp
 *
 * [367] 有效的完全平方数
 */

// @lc code=start
class Solution {
public:
    bool isPerfectSquare(int num) {
        //1,和num本身左右搜索边界,用常规二分写法即可
        long lp = 1;
        long rp = num;
        long middle;
        while(lp <= rp){
            middle = lp + (rp - lp) / 2;
            if(middle*middle < num){
                lp = middle + 1;
            }else if(middle*middle > num){
                rp = middle - 1;
            }else if(middle*middle == num){
                return true;
            }
            
        }
        return false;

    }
};
// @lc code=end

// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include "commoncppproblem69.h"

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=69 lang=cpp
 *
 * [69] x 的平方根 
 */

// @lc code=start
class Solution {
public:
    int mySqrt(int x) {

      
        //设置搜索边界从1到x
        long lp = 1;
        long rp = x;
        long middle;


        //x的平方根仅存在两种情况(偏小或偏大)
        //1.恰好取整数
        //2.舍去后取整数
        while(lp <= rp) {
            middle = lp + (rp - lp) / 2;
            if(middle* middle <= x && (middle+1)*(middle+1) > x){
                return middle;
            }else if(middle*middle > x){
                rp = middle - 1;
            }else{
                lp = middle + 1;
            }
        }
        
       

        return 0;
    }
};
// @lc code=end

posted @ 2024-02-22 17:13  main(void)  阅读(4)  评论(0编辑  收藏  举报
.c_ad_block { display: none !important; } #ad_t2{ display: none !important; }