剑指offer面试题31、34、36、38

16 篇文章 0 订阅

剑指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);
		}
	}
};
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值