关于一道题目解法

题目:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
分析:一开始直接想到使用循环遍历,但是算法繁杂度是n的平平方,明显太简单,不能满足逼格,因此,放弃掉了,后来又没能想出来更好的解法,懵逼了,后来四处查了查,弄懂了,然后分享给大家:
首先从一个简单的问题出发:对于两个升序数组合并为一个升序数组,一次遍历,如何解决?借助图像嘛:

通过图像我们可以发现,很多时候我们可以通过同时移动两部分以实现一次遍历,这里的结题思路就是通过先排序再前后同时移动,以实现一次遍历就可以找出:
这是两个数组嘛

第一次比较后

1便是第一个数,而后上面一个数组往后移,就是2比较,很自然,2就是第二个,当5比较的时候
这里写图片描述
3便往后移,5不动,直到下面数组的值大于等于5.
利用这种思想,我们来解决本题。

/*函数定义*/
int* twoSum(int* nums,int numsSize,int target) {
/*num是排序后数组的首地址,numSize是数组长度,target是两数之和*/
}
/*首先开辟空间*/
int *arr = (int *)malloc(sizeof(int)*2);
int low=0,high=numsSize-1;//定义好只向头部的指针和指向尾部的指针
/*开始循环比较*/
while(target != nums[low]+nums[high])
{
    if(target > nums[low]+nums[high])
    {
        low++;
    }
    else
    {
        high--;
    }
    /*防止low == high,死在循环里面了*/
    if(low == high)
    {
        break;
    }
}
/*循环完,赋值*/
if(low != high)
{
    arr[0] = nums[low];
    arr[1] = nums[high];
}
else
{
    arr[0] = nums[low];
    arr[1] = arr[0];
}
/*这既是C的思路与做法*/

Java做法是用哈希表,目前我还不会,以后做出来了补上

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值