牛客面试必刷101——查找

二分查找:

二分查找icon-default.png?t=N3I4https://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b?tpId=295&tqId=1499549&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295 

//时间复杂度O(logN) 空间复杂度O(1)
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (right >= left)
        {
            int mid = (right+left) / 2;
            if (nums[mid] == target)
                return mid;
           
            if (nums[mid] > target)
            {
                right = mid - 1;
            }
            else 
            {
                left = mid + 1;
            }
        }
        return -1;
    }
};

 

二维数组查找icon-default.png?t=N3I4https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=295&tqId=23256&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295 

//思路1:对每一行进行二分查找
//时间复杂度O(MN) 空间复杂度O(1)
class Solution {
public:
    bool binary_search(vector<int>&vi,int target)
    {
        int left=0,right=vi.size()-1;
        while(left<=right)
        {
            int mid=(left+right)/2;
            if(vi[mid]==target)
                return true;
            else if(vi[mid]<target)
                left=mid+1;
            else
                right=mid-1;
        }
        return false;
    }

    bool Find(int target, vector<vector<int> > array) {
        for(auto&it:array)
        {
            if(binary_search(it,target)) return true;
        }
        return false;
    }
};

//思路2:找规律
//时间复杂度O(M+N) 空间复杂度O(1)
class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
       if(array.size()==0) return false;
       int r=array.size();
       int l=array[0].size();
       int left=0,down=r-1;
       while(left<l && down>=0)
       {
            int tmp=array[down][left];
            if(tmp==target)
                return true;
            else if(tmp<target) left++;
            else down--;
       }
       return false;
    }
};

 

寻找峰值icon-default.png?t=N3I4https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76?tpId=295&tqId=2227748&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295 

//时间复杂度O(logN) 空间复杂度O(1)
class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left=0,right=nums.size()-1;
        while(left<right)
        {
            int mid=(left+right)/2;
            if(nums[mid]>nums[mid+1])
                right=mid;
            else
                left=mid+1;
        }
        return right;
    }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值