题解 | 两数之和

两数之和

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param numbers int整型一维数组 
 * @param numbersLen int numbers数组长度
 * @param target int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */

typedef struct {
    int value;
    int index;
} Element;

int compare (const void* a, const void* b) {
    return ((Element*)a)->value - ((Element*)b)->value;
}

int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
    // // 时间复杂度为O(n2)
    // // 分配内存存储结果
    // int* result = (int*)malloc(2 * sizeof(int));
    
    // for (int i = 0; i < numbersLen - 1; i++) {
    //     for (int j = i + 1; j < numbersLen; j++) {
    //         if (numbers[i] + numbers[j] == target) {
    //             result[0] = i + 1;
    //             result[1] = j + 1;
    //             // 设置返回数组的大小为2
    //             *returnSize = 2;
    //             return result;
    //         }
    //     }
    // }
    
    // // 理论上不会执行到这里,因为题目保证有解
    // *returnSize = 0;
    // return NULL;



    // O(nlogn)使用排序+双指针
    // 用分治 qsort进行排序
    Element* elements = (Element*)malloc(sizeof(Element)*numbersLen);
    for (int i=0; i<numbersLen; i++) {
        elements[i].index = i+1;
        elements[i].value = numbers[i];
    }

    qsort(elements, numbersLen, sizeof(Element), compare);

    int low = 0, high = numbersLen-1;
    int* result = (int*)malloc(sizeof(int)*2);
    while(low < high) {
        int sum = elements[low].value + elements[high].value;
        if (sum == target) {
            // 确保返回的索引是升序
            if (elements[low].index <= elements[high].index) {
                result[0] = elements[low].index;
                result[1] = elements[high].index;
            } else{
                result[0] = elements[high].index;
                result[1] = elements[low].index;
            }

            *returnSize = 2;
            free(elements);
            return result;
        } else if (sum > target) {
            high --;
        } else {
            low ++;
        }
    }


    *returnSize = 0;
    free(elements);
    return NULL;
}

全部评论

相关推荐

02-04 12:01
九江学院 C++
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务