LeetCode_1.Two Sum

Problem Description:

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, and you may not use the same element twice.

Example:

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

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

这个题的大致意思就是输入一串数nums和目标数target,找出其中两个数和为目标数的下标,并返回。

这道题比较简单,一个遍历就能解决。有两种思路:1、直接找两个数判断和是否为目标数,两重循环,最坏情况复杂度O(N^2);2、用目标数减去其中一个数,再在数组中查找,最坏复杂度也是O(N*查找算法的复杂度)。如果用二分法查找,则为O(N*log(N));

再来看一下所给的函数接口:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target) {
}

传递三个形参,数组首地址、数组大小、目标数。返回指针。从返回指针就可以知道,需要malloc,不然的话函数里面定义的数组会被直接释放,只有malloc开辟的内存是放在堆里面的,不会直接释放。

源代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target) {
    int i,j,k=0;
    int sum;
    int t[numsSize],*s;
    
    for(i = 0; i < numsSize; i++)
    {
    	sum = nums[i];
    	for(j = i+1; j< numsSize; j++)
    	{
    		sum += nums[j];
    		if(sum == target)			/* 若找到,则存储下标 */ 
    		{
    			t[k++] = i;
    			t[k++] = j;
			}
            sum = nums[i];              /* 重新赋初值 */
		}
	}
    
	s = (int *)malloc(k*sizeof(int));
	for(i = 0; i < k; i++)
		s[i] = t[i];
	return s;
}

运行结果:

我用的是第一种算法,从运行时间可以看出,这个算法一般;可以试着用第二种算法改进,鉴于目前时间关系以后有时间在编写。欢迎探讨,谢谢!

给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值