分治(折半查找)BinaryChop
将一个大问题分解成解决方案完全相同的子问题,(注:分治法不一定非用递归来完成)
(1)问题难度随着数据规模的缩小而降低
(2)问题能折分成小问题
(3)子问题的解可合并
(4)子问题的解之间相互独立(答案互不干扰互不影响,斐波那契明显不是)
二分查找的大前提是查找事件有序
二分法是从中间取,例如 1~100的数字,让你猜一个数,如果用二分最先想到的数字就是50,原因就是:等概率事件构成最优下界。
二分步骤:
(1)取mid
(2)比较mid和要找的数:
如果相等,则找到
如果mid>要找的数,则下次查找左侧部分,范围是(起始,mid-1)
如果mid<要找的数,则下次查找右侧部分,范围是(mid+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=(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
快速幂
:当n=0时,公式=1
当n为奇数*
当n为偶数时,之后判断n/2是奇数还是偶数,执行这两步