分治算法及例题,快速幂简单解释

本文介绍了分治法的基本原理,特别是二分查找的步骤,通过实例展示了如何在有序数组中使用二分查找算法,并提及其他分治问题如快速幂。重点讲解了递归的应用以及注意事项。
摘要由CSDN通过智能技术生成

分治(折半查找)BinaryChop

将一个大问题分解成解决方案完全相同的子问题,(注:分治法不一定非用递归来完成)

(1)问题难度随着数据规模的缩小而降低

(2)问题能折分成小问题

(3)子问题的解可合并

(4)子问题的解之间相互独立(答案互不干扰互不影响,斐波那契明显不是)

二分查找的大前提是查找事件有序

二分法是从中间取,例如 1~100的数字,让你猜一个数,如果用二分最先想到的数字就是50,原因就是:等概率事件构成最优下界。

二分步骤:

(1)取mid

(2)比较mid和要找的数:

如果相等,则找到

如果mid>要找的数,则下次查找左侧部分,范围是(起始,mid-1)

如果mid<要找的数,则下次查找右侧部分,范围是(mid+1,末尾)

例题:704. 二分查找 - 力扣(LeetCode)

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    int search(vector<int>& nums, int target) {
     int l=0;
     int r=nums.size() - 1;
     int mid=(r+l+1)/2;
     while(nums[mid]!=target){
     if(nums[mid]>target){
         r=mid-1;
         mid=(r+l+1)/2;
         if(r<l) return -1;
     }
     else if(nums[mid]<target){
         l=mid+1;
         mid=(r+l+1)/2;
         if(l>r) return -1;
     }
 }
     return mid;
    }
    int main()
    {
        vector<int> nums = {-1, 0, 3, 5, 9, 12};
        int n;
        cin>>n;
        cout<<search(nums,n);
        return 0;
    }
};

(注:这里得用nums.size()-1要不然堆缓冲区溢出)

或者:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    int search(vector<int>& nums, int target) {
     int l=0;
     int r=nums.size() - 1;
     int mid;
     while(l<=r){
          mid=(r+l+1)/2;
     if(nums[mid]>target)  r=mid-1;
     else if(nums[mid]<target) l=mid+1;
     else return mid;
     }
     return -1;
 }
    
    int main()
    {
        vector<int> nums = {-1, 0, 3, 5, 9, 12};
        int n;
        cin>>n;
        cout<<search(nums,n);
        return 0;
    }
};

其它分治例题题解下一篇文章发OuO

快速幂

x^{n}:当n=0时,公式=1

      当n为奇数x^{^{}}*x^{_{n-1}}

      当n为偶数时x^{n/2}*x^{n/2},之后判断n/2是奇数还是偶数,执行这两步

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值