每日一题
两数之和
题目链接
思路
注:本题只采用暴力解法,时间复杂度为O(n2),如果采用哈希表,可以将时间复杂度降到O(n),但由于笔者还未对哈希表展开学习,故不做讨论
我们直接用两层for循环来解决问题
第一层for循环用来遍历整个数组,第二层for循环用来判断遍历的两个数的和是否等于target
for(int i = 0; i < numsSize - 1; i++) { for(int j = i + 1; j < numsSize; j++) { if(nums[i] + nums[j] == target) { ……………………; } } }
实现代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
//确定返回数组的大小
*returnSize = 2;
//申请的返回数组
int *res = (int *)malloc(sizeof(int) * 2);
//寻找满足条件的两个数
for(int i = 0; i < numsSize - 1; i++)
{
for(int j = i + 1; j < numsSize; j++)
{
if(nums[i] + nums[j] == target)
{
res[0] = i;
res[1] = j;
}
}
}
//返回这两个数的下标
return res;
}
拓展
- 这道题要求返回的是满足条件的两个数的下标,但如果将题目要求改为返回这两个数的值呢?
思路
当然我们同样可以上面的暴力解法来解决问题,但有没有效率更高的方法呢?
我们可以采用双指针的方法
首先我们假设题目给的数组是一个有序数组,那题解过程如图所示:
文章来源:https://www.toymoban.com/news/detail-467337.html
由此可见,要使用双指针的方法,就一定要确保数组是有序的(只有这样,才能保证i右移后,nums[i] + nums[j]会变大,j左移后,nums[i] + nums[j]会变小),因此,我们最开始就要用排序算法来使数组nuns有序。文章来源地址https://www.toymoban.com/news/detail-467337.html
实现代码
void Sort(int *nums, int numsSize)
{
for(int i = 0; i < numsSize - 1; i++)
{
for(int j = i + 1; j < numsSize; j++)
{
if(nums[i] > nums[j])
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *res = (int *)malloc(sizeof(int) * 2);
*returnSize = 2;
//排序
Sort(nums,numsSize);
//从数组的头和尾对数组进行遍历
int i = 0, j = numsSize - 1;
//找到符合条件的两个数
while(i < j)
{
if(nums[i] + nums[j] > target)
j--;
else if(nums[i] + nums[j] < target)
i++;
else
{
res[0] = nums[i];
res[1] = nums[j];
break;
}
}
//返回数组
return res;
}
到了这里,关于每日一题——两数之和(返回下标和返回数值两种情况)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!