PAT A1029 Median(25 分)AC代码 成功解决内存超限 PAT已修复问题

解题思路:

  1. 本题难点在于内存限制,如果将数据全部读入,内存会超限。
  2. 可以使用双针法,也可以合并两个数组然后再排序,但后者会出现内存超限。
  3. 另外,在每一组数据最后可以放置一个int最大值,以防有一个数组所有值比另一个都大,导致数组访问超限。

AC:使用双针法,第二个数组数据边读边进行

#include <cstdio>
#include <cstdlib>

const int INF = 0x7fffffff;
int main() {
    int l1, l2, i, j, count = 0;
    int *a1, a2;

    scanf("%d", &l1);
    a1 = (int *)malloc((l1 + 1) * sizeof(int));
    for (i = 0; i < l1; i++)
        scanf("%d", a1 + i);
    *(a1 + l1) = INF;
    scanf("%d", &l2);
    //a2 = (int *)malloc((l2 + 1) * sizeof(int));
    //for (i = 0; i < l2; i++)
    //  scanf("%d", a2 + i);
    //*(a2 + l2) = INF;

    int mid = (l1 + l2 - 1) / 2;            // l1 = mediapos
    i = j = 0;
    scanf("%d", &a2);
    while (count < mid)
    {
        if (*(a1 + i) < a2) i++;
        else {
            j++;
            if (j < l2)
            {
                scanf("%d", &a2);
            }
            else if (j == l2)
                a2 = INF;
            else
                break;
        }
        count++;
    }

    printf("%d\n", *(a1 + i) < a2 ? *(a1 + i) : a2);

    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值