如果读者们最下面的题目有更好的想法请联系我交流一下,QQ 1192625541
1.已知A、B、M都在集合S中,且满足A+B=M,求M得最大值,并分析算法的复杂度
这道题的思路是这样的,先对S进行排序,从小到大,然后从最大的元素M开始,设置两个指针分别指向第一个元素A和最大的元素减一的B,如果A+B=M,OK,最大的M找到了,如果A+B<M,指向A的指针右移,如果A+B>M,指向B的指针左移,如此循环,一直找不到的话,M就设为第二大的元素,继续重复之前的步骤,直到找到最大的M,全部扫完找不到就返回-1,代码如下:
int maxM(int a[]){
quiksort(a[]);
int right,left,sum;
for(int i=a.length;i>=2;i--){
left=0;
right=i-1;
while(left<right){
sum=a[left]+a[right];
if (sum==a[i]){
return a[i];
}
else if(sum>a[i]){
right--;
}
else{
left++;
}
}
}
return -1;
}
</pre><pre>2.求子数组和最大的问题
这道题目是编程之美上的经典题目

本文回顾了四月份遇到的几道编程笔试题,包括寻找集合中满足A+B=M的最大M值问题,以及计算将正整数n转化为1所需的最少操作次数。通过排序和双指针策略解决第一题,采用分治思想解决第二题,对于第三题,描述了根据n的奇偶性进行不同操作以达到1的过程。这些题目常见于IT公司的面试和笔试中,展现了分而治之的编程思维。
最低0.47元/天 解锁文章
2717

被折叠的 条评论
为什么被折叠?



