LeetCode —— 两数之和

题目

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:给定 nums = [2, 7, 11, 15], target = 22,因为 nums[1] + nums[3] = 7 + 15 = 22,所以返回 [1, 3]

简单解法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

int* twoSum(int* nums, int numsSize, int target) {
    int i = 0;
    int j = 0;
    int num = 0;
    int *arr = NULL;
    assert(nums != NULL);
    arr = (int*)malloc(sizeof(int)* 2);
    for (i = 0; i<numsSize; i++){
        for (j = 0; j<numsSize; j++){
            num++;
            if ((i != j) && ((nums[i] + nums[j]) == target)){
                arr[0] = i;
                arr[1] = j;
                printf("计算次数:%d\n", num);
                return arr;
            }
        }
    }

    return NULL;
}

int main(void)
{
    int array[] = {2, 7, 11, 15};
    int *ret_arr = twoSum(array, sizeof(array) / sizeof(array[0]), 22);
    printf("%d %d\n",ret_arr[0],ret_arr[1]);
    system("pause");
    return 0;
}

优化版

主要是去掉重复比较元素,j = i + 1这一句代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

int* twoSum(int* nums, int numsSize, int target) {
    int i = 0;
    int j = 0;
    int num = 0;
    int *arr = NULL;
    assert(nums != NULL);
    arr = (int*)malloc(sizeof(int)* 2);
    for (i = 0; i<numsSize; i++){
        for (j = i+1; j<numsSize; j++){
            num++;
            if ((i != j) && ((nums[i] + nums[j]) == target)){
                arr[0] = i;
                arr[1] = j;
                printf("计算次数:%d\n", num);
                return arr;
            }
        }
    }

    return NULL;
}

int main(void)
{
    int array[] = {2, 7, 11, 15};
    int *ret_arr = twoSum(array, sizeof(array) / sizeof(array[0]), 22);
    printf("%d %d\n",ret_arr[0],ret_arr[1]);
    system("pause");
    return 0;
}

结果差异

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81295098