分治算法(dac),是对递归或者递推技术的一种具体运用。处理问题的过程中,我们有时的确分而且治了(线性时间选择,归并排序),但更多情况下,恐怕是一种分而不治的思想(假硬币寻找,众数问题)通过递归技术,在逻辑上不断使原问题规模缩减,类似树从根节点不断寻值,直到返回目标值。
1,假硬币寻找:
问题很简单:n个数形成了一个数组,只有一个数与其他数值不同,找到其下标。
思想:对于奇数个硬币,找到中间值(注意:对数组的分治经常会寻找中间值),对左右比较(这点思路很简单,不赘述)
对偶数个硬币,找到中间两个硬币,进行左右比较即可。
#include <stdio.h>
int sum(int a[],int min,int max)
{
int sum=0; //注意此处赋值
for(int i=min;i<=max;i++)
{
sum+=a[i];
}
return sum;
}
int Judge(int a[],int min,int max)
{
int mid;
int mid1;
if((max-min+1)%2==0)
{
mid=(max+min)/2;
mid1=mid+1;
if(sum(a,min,mid-1)>sum(a,mid1+1,max))
{
Judge(a,mid1+1,max);
}
else if(sum(a,min,mid-1)==sum(a,mid1+1,max))
{
if(a[mid]<a[mid1])
{
return mid;