每日一题——两数之和(返回下标和返回数值两种情况)

简介: 每日一题——两数之和(返回下标和返回数值两种情况)

两数之和

题目链接

思路

注:本题只采用暴力解法,时间复杂度为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;
}

拓展

  • 这道题要求返回的是满足条件的两个数的下标,但如果将题目要求改为返回这两个数的值呢?

思路

  • 当然我们同样可以上面的暴力解法来解决问题,但有没有效率更高的方法呢?
  • 我们可以采用双指针的方法
  • 首先我们假设题目给的数组是一个有序数组,那题解过程如图所示:

  • 由此可见,要使用双指针的方法,就一定要确保数组是有序的(只有这样,才能保证i右移后,nums[i] + nums[j]会变大,j左移后,nums[i] + nums[j]会变小),因此,我们最开始就要用排序算法来使数组nuns有序。

实现代码

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


相关文章
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
8月前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
8月前
力扣421. 数组中两个数的最大异或值(字典树)
力扣421. 数组中两个数的最大异或值(字典树)
|
8月前
44.从键盘输入12个数存入二维数组a[3][4]中,编写程序求出最大元素的值及它所在的行号和列号
44.从键盘输入12个数存入二维数组a[3][4]中,编写程序求出最大元素的值及它所在的行号和列号
114 0
|
8月前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
存储 索引
信息学奥赛 如何在整数数组中寻找两数之和等于给定目标值
本文介绍了在整数数组中寻找两个数之和等于给定目标值的问题,提供了两种解法:暴力法和哈希表法。通过比较两种解法的时间复杂度,指出了哈希表法更为高效。
129 0
|
8月前
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
每日一题(づ ̄3 ̄)づ╭❤~(数字在升序数组中出现的次数,整数转换)
50 0
|
C语言
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
218 0
接受一个整型值,按照顺序打印他的每一位(函数,递归方法)
LeetCode 5429. 数组中的 k 个最强值
给你一个整数数组 arr 和一个整数 k 。
74 0
|
人工智能
利用数组,实现回文数的判断
任务:利用数组,实现回文数的判断 #include&lt;iostream&gt; using namespace std; bool isPalindrome(int); int main() { int m,n; cout&lt;&lt;"求多少以内的回文数?"&lt;&lt;endl; cin&gt;&gt;m; for(n=1;n&lt;=m;++n) if(isPali
1329 0