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

在这里插入图片描述

代码:

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

在这里插入图片描述

  • 35
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二球悬铃木丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值