剑指offer面试题31、34、36、38代码如下:
//面试题31:连续子数组的最大和
class Max_sum
{
public:
int get_maxsum(int num[],int len) //(动态规划)
{
if(num==nullptr||len<=0)
return NULL;
vector<vector<int>> result(len,vector<int>(len,0));
int max_sum=0;
for(int j=0;j<len;j++)
for(int i=j;i>=0;i--)
{
if(i==j)
{
result[i][j]=num[i];
if(result[i][j]>max_sum)
max_sum=result[i][j];
}
else
{
result[i][j]=result[i][j-1]+num[j];
if(result[i][j]>max_sum)
max_sum=result[i][j];
}
}
return max_sum;
}
int get_maxsum2(int num[],int len)
{
if(num==nullptr||len<=0)
return NULL;
int max_sum=num[0]; //最大和
int sum=num[0]; //当前和
for(int i=1;i<len;i++)
{
sum=sum+num[i];
if(sum<=0)
sum=0;
if(sum>max_sum)
max_sum=sum;
}
return max_sum;
}
};
//面试题34:第n个丑数
class uglyNumber
{
public:
int get_ugly(int index)
{
if(index<=0)
return 0;
int *ugly_numbers=new int[index+1];
memset(ugly_numbers,0,(index+1)*sizeof(int));
ugly_numbers[0]=1;
int next_index=1;
//剑指offer上的思想非常好
int *p2=ugly_numbers;
int *p3=ugly_numbers;
int *p5=ugly_numbers;
while(next_index<=index)
{
ugly_numbers[next_index]=min((*p2)*2,(*p3)*3,(*p5)*5);
while((*p2)*2<=ugly_numbers[next_index])
++p2;
while((*p3)*3<=ugly_numbers[next_index])
++p3;
while((*p5)*5<=ugly_numbers[next_index])
++p5;
next_index++;
}
return ugly_numbers[next_index-1];
}
int min(int a,int b,int c)
{
int tem=a<b?a:b;
int result=tem<c?tem:c;
return result;
}
};
//面试题36:数组中的逆序对
class InversePairs
{
public:
int inverse(int *data,int len)
{
if(data==nullptr||len<=0)
return 0;
count=0;
int *copy=new int[len];
memcpy(copy,data,len*sizeof(int));
/*for(int i=0;i<len;i++)
copy[i]=data[i];*/
int c=count_inverspairs(data,copy,0,len-1);
}
int count_inverspairs(int *data,int *copy_data,int start,int end)
{
if(start==end)
{
copy_data[start]=data[start];
return 0;
}
int len=(end-start)/2;
int left=count_inverspairs(data,copy_data,start,start+len);
int right=count_inverspairs(data,copy_data,start+len+1,end);
int i=start+len;
int j=end;
int index=end;
while(i>=start&&j>=start+len+1)
{
if(data[i]>data[j])
{
count=count+j-start-len;
data[index--]=copy_data[i--];
}
else
{
data[index--]=copy_data[j--];
}
}
for(;i>=start;i--)
data[index--]=copy_data[i];
for(;j>=start+len+1;j--)
data[index--]=copy_data[j];
return count;
}
private:
int count;
};
//面试题38:求数字在排序数组中出现的次数
class getnumber
{
public:
int get_numberofK(int *num,int len,int k)
{
if(num==nullptr||len<0)
return -1;
int first=_get_firstK(num,k,0,len-1);
int last=_get_lastK(num,k,first+1,len-1);
return last-first+1;
}
private:
int _get_firstK(int *num,int k,int start,int end)
{
if(num==nullptr||start>end)
return -1;
int mimu=(end+start)/2;
if(num[mimu]==k)
{
if(num[mimu-1]!=k)
return mimu;
else
{
return _get_firstK(num,k,start,mimu-1);
}
}
else if(num[mimu]<k)
{
return _get_firstK(num,k,mimu+1,end);
}
else
{
return _get_firstK(num,k,start,mimu-1);
}
}
int _get_lastK(int *num,int k,int start,int end)
{
if(num==nullptr||start>end)
return -1;
int mimu=(end+start)/2;
if(num[mimu]==k)
{
if(num[mimu+1]!=k)
return mimu;
else
{
return _get_firstK(num,k,mimu+1,end);
}
}
else if(num[mimu]<k)
{
return _get_firstK(num,k,mimu+1,end);
}
else
{
return _get_firstK(num,k,start,mimu-1);
}
}
};