LeetCode Problem 1解析

  之前也在其他OJ上做过几道题,一位学姐介绍我说,让我刷刷LeetCode的题,上面有些是公司的面试题,我拖到现在才去注册了个账号。第一次上只需要写部分程序的OJ,这让我有点不习惯,后来百度才知道这样有助于提高程序的运行速度,避免了调用I/O接口。。。
  回归正题,英语渣渣靠着百度翻译读懂了题目,是找出一个整数数组中两个相加等于目标值的整数的位置,我一拍脑袋不就是两重循环嘛,但想想这样的话时间是O(n^2),有点大,然后就想两数相加的值已知,如果利用快拍使得序列是有序的(从小到大)那么用两个指针指向头和尾,如果两个指针所指的值偏大,则尾指针向前移,反之则头指针向后移,最后遍历一遍原数组,找出位置返回位置,这样一来时间复杂度是O(nlgn)

int comp(const void *a, const void *b)/*快排的比较函数*/
{
    return *(int*)a - *(int*)b;
}

int* twoSum(int* nums, int numsSize, int target) {
    int *numcpy = (int*)malloc(sizeof(int) * numsSize);/*最后遍历的数组*/
    memcpy(numcpy, nums, numsSize * 4);
    qsort(nums, numsSize, sizeof(int), comp);/*原数组排序*/
    int *p, *q, *result = (int*)malloc(sizeof(int) * 2), pv = 0, qv = 0;/*p为头指针,q为尾指针,pv为遍历数组时是否已找到*p的原位置,qv同理*/
    result[0] = result[1] = numsSize - 1;
    p = nums;
    q = p + numsSize - 1;
    while(*p + *q != target) {
        if(*p + *q > target) {
            q--;
        } else {
            p++;
        }
    }/*找到两个数值*/
    for(numsSize--; !pv || !qv; numsSize--) {
        if(numcpy[numsSize] == *q && !qv) {
            result[1] = numsSize;
            qv = 1;
        } else if(numcpy[numsSize] == *p && !pv) {
            result[0] = numsSize;
            pv = 1;
        }
    }/*从最后开始查找到两个数字的原位置*/
    return result;
}

AC了,之后看他给的解析,他用的是哈希表,利用哈希表可以根据每一个num去查找target-num的值是否存在,这样一来,时间复杂度再次降低到O(n),虽然标签是Easy,但解法对我来说并不太easy,(谁让我对哈希表的用法不太熟呢)
题目地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值