题解 | #两数之和#

两数之和

https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numbers int整型一维数组 
 * @param numbersLen int numbers数组长度
 * @param target int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
//下面这个为暴力遍历,时间复杂度太高
//因为没有忽略不可能为加数的数组值
/*
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    // write code here
    int* re=(int*)malloc(sizeof(int)*2);
    *returnSize=2;
    int flag=0;
    for(int i=0;i<numbersLen-1;i++)
    {
        for(int j=i+1;j<numbersLen;j++)
        {
            if(numbers[j]==(target-numbers[i]))
            {
                re[0]=i+1;
                
                re[1]=j+1;
                flag++;
                break;
            }
        }
        if(flag)
        {
            break;
        }
    }
    return re;
}
*/

//numbers[i] > target+10;
//因为题目给的数组中可能包含最小为-10的负数,需要当前数大于目标值+10,再跳过以免忽略含[100,-10]90的情况
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    // write code here
    int* re=(int*)malloc(sizeof(int)*2);
    *returnSize=2;
    int flag=0;
    for(int i=0;i<numbersLen-1;i++)
    {
        if(numbers[i]>target+10) continue;
        //w为什么要加上面的这行?
        //因为数组中最小的数也就是-10,若数大于目标超过10,则不可能找到另一个数相加=target
        for(int j=i+1;j<numbersLen;j++)
        {
            if(numbers[j]==(target-numbers[i]))
            {
                re[0]=i+1;
                
                re[1]=j+1;
                flag++;
                break;
            }
        }
        if(flag)
        {
            return re;
          //  break;
        }
    }
    return 0;
}

全部评论

相关推荐

头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务