Leedcode.1两数之和

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的下标并返回。

Leedcode.1两数之和_第1张图片

代码:

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;
}

方法二:双指针

思路:
   由于数组元素无序,我们可以先排成升序。然后使用双指针法进行遍历。
Leedcode.1两数之和_第2张图片
左指针对应的值加上右指针对应的值Sum

  若Sum


  若Sum

通过遍历我们可以找到这两个数,但要怎么返回他们的下标呢?
什么数据类型可以既存储数值,又能存储下标呢?

没错,就是结构体
我们通过左右指针找到目标的值和下标,

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; 
}

Leedcode.1两数之和_第3张图片

你可能感兴趣的:(噬人之风,c语言)