算法基础——双指针练习2
双指针练习2
一、PAT甲级1029
这里我把题目已经翻译过了,原题目是英文


问题描述:给出两个递增序列,现在要求找出两个递增序列合并后的序列的中位数,可以不执行合并操作,只要找到中位数就行。
解题思路:既然题目以及给出了每组数据的个数,那么当然要把这个信息利用起来,就如上面的案例中第一组案例有4个数,第二组案例有5个数,那么总共肯定不超过9个数,中位数就是逻辑合并后数组中下标为(4+5-1)/2的数,那么可以定义两个指针分别遍历两个序列,指针每移动一次计数器加1,当计数器等于中位数的逻辑下标时就输出当前指针指向的数。
算法描述:设两个数组长度分别为m和n,定义数组A1[]和数组A2[]分别存放输入,定义计数器count初值为0;
当数组输入完成后,定义两个指针i和j分别指向A1和A2,依次比较A1[i]和A2[j]的值,如果A1[i]<A2[j]就使i++,同时让count++,并判断count是否等于(n+m-1)/2;否则就使j++,同时 也让count++,并判断count是否等于(n+m-1)/2;
当上面对count的判断成立时,就输出当前指针所指向的值,并中断循环。
算法简化:通过上面的算法描述我们可以发现每次count移动时那么当前count所在程序题内的指针一定是两个指针中最小的那个,或者说当*i比*j小,那么i会移动,而且count也会++,反之j 也会移动,所以当count达到(n+m-1)/2时,*i和*j中小的那个元素就是我们要的元素;可以假设一种情况,当i++后,count到达边界,那么此时只是判断到了中位数前的那个元 素,下一步对中位数的判断不在循环中,而是从*i和*j中选出小的那一个作为中位数。所以得出以下代码
核心代码


浙公网安备 33010602011771号