1 . 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1] 解释:
因为 nums[0] + nums[1] ==9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
*方法一:暴力枚举
思路:
设数组中第一个数为X,遍历数组寻找target-X。
若没找到,则再用第二个数,重复操作。
由于数组本身没有改变,用变量存储X和target-X的下标并返回。
代码:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
/*从第一个数字开始*/
for (int i = 0 ; i<numsSize-1 ; i++)
{
/*和后一个比较*/
for(int j = i+1 ; j <numsSize ;j++)
{
/*如果满足条件,返回*/
if (nums[i]+nums[j]==target)
{
int *array = (int*)malloc(2*sizeof(int));
array[0] = i;
array[1] = j;
*returnSize = 2;
return array;
}
}
}
return 0;
}
方法二:双指针
思路:
由于数组元素无序,我们可以先排成升序。然后使用双指针法进行遍历。
记左指针对应的值加上右指针对应的值为Sum
若Sum<target,左指针右移。
若Sum<target,右指针左移
通过遍历我们可以找到这两个数,但要怎么返回他们的下标呢?
什么数据类型可以既存储数值,又能存储下标呢?
没错,就是结构体。
我们通过左右指针找到目标的值和下标,
typedef struct data
{
int value; //value数组元素的数值
int index; //数组下标
}data;
int cmp(const void* e1,const void * e2)//排序函数
{
data* pa = (data*)e1;
data* pb = (data*)e2;
return pa->value >pb->value;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
data* array = (data*)malloc(numsSize*sizeof(data));
for(int i = 0 ;i < numsSize ; i++)//copy一个数组
{
array[i].value = nums[i];
array[i].index = i;
}
qsort (array, numsSize, sizeof(data),cmp);//快速排序
int left = 0;
int right = numsSize-1;
int *ret=(int*)malloc(sizeof(int)*2);
while (left<right)
{
if(array[left].value+array[right].value<target)
{
left++;
}
else if(array[left].value+array[right].value>target)
{
right--;
}
else
{
ret[0] = array[left].index;
ret[1] = array[right].index;
break;
}
}
*returnSize=2; //返回的数组大小为2
return ret;
}