题目
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:给定 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;
}