C++二分查找视频教程:两数之和

简介: C++二分查找视频教程:两数之和

题目

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

示例 1:

输入:numbers = [2,7,11,15], target = 9

输出:[1,2]

解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6

输出:[1,3]

解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1

输出:[1,2]

解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

参数范围

2 <= numbers.length <= 3 * 104

-1000 <= numbers[i] <= 1000

numbers 按 非递减顺序 排列

-1000 <= target <= 1000

仅存在一个有效答案

解法一:二分查找

枚举第一个数,然后二分查找,是否存在

class Solution {
public:
vector twoSum(vector& numbers, int target) {
for (int i = 0; i < numbers.size(); i++)
{
const int iNeed = target - numbers[i];
auto it = std::equal_range(numbers.begin() + i + 1, numbers.end(), iNeed);
if (it.second - it.first > 0)
{
return vector{ i + 1,(int)(it.first - numbers.begin() + 1 )};
}
}
return { 1,2 };
}
};

解法二:哈希映射

用哈希映射记录可能的第二个数及索引,枚举第一个数的时候直接从哈希映射查询。

class Solution {
public:
vector twoSum(vector& numbers, int target) {
unordered_map mValueIndex;
for (int i = numbers.size() - 1; i >= 0; i–)
{
const int iNeed = target - numbers[i];
if (mValueIndex.count(iNeed))
{
return vector{i + 1, mValueIndex[iNeed] + 1};
}
mValueIndex[numbers[i]] = i;
}
return { 1,2 };
}
};

解法三:双指针

如果numbers[left]+ numbers[right]小于目标数,则将则left抛弃,right取任何数结果都小于目标数。

如果numbers[left]+ numbers[right]大于目标数,则将则right抛弃,left取任何数结果都大于目标数。

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {    
    int left = 0, right = numbers.size() - 1;//结果一定在[left,right]中
    while (right > left)
    {
      if (numbers[left] + numbers[right] > target)
      {
        right--;
      }
      else if (numbers[left] + numbers[right] < target)
      {
        left++;
      }
      else
      {
        return vector<int>{left + 1, right + 1};
      }
    }
    return { 1,2 };
    }
};

测试用例

template <class T>
void Assert(const T& t1, const T& t2)
{
  assert(t1 == t2);
}
template <class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
  if (v1.size() != v2.size())
  {
    assert(false);
    return;
  }
  for (int i = 0; i < v1.size(); i++)
  {
    Assert(v1[i], v2[i]);
  }
}
int main()
{
  vector<int> numbers, res;
  int target;
  {
    numbers = { 2, 7, 11, 15 };
    target = 9;
    Solution slu;
    res = slu.twoSum(numbers, target);
    Assert(res, vector<int>{1,2});
  }
  {
    numbers = { 2,3,4 };
    target = 6;
    Solution slu;
    res = slu.twoSum(numbers, target);
    Assert(res, vector<int>{1, 3});
  }
  {
    numbers = { -1,0 };
    target = -1;
    Solution slu;
    res = slu.twoSum(numbers, target);
    Assert(res, vector<int>{1, 2});
  }
  //CConsole::Out(res);
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版

https://download.csdn.net/download/he_zhidan/88348653

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境:

VS2022 C++17



相关文章
|
8月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
8月前
|
算法 测试技术 C#
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
8月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
8月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
8月前
|
算法 测试技术 C++
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
|
8月前
|
Python C++ 算法
C/C++每日一练(20230406) 按要求求质数、两数之和、颜色分类
C/C++每日一练(20230406) 按要求求质数、两数之和、颜色分类
62 0
C/C++每日一练(20230406) 按要求求质数、两数之和、颜色分类
|
8月前
|
算法 测试技术 C++
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
8月前
|
算法 测试技术 C#
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字
|
8月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
8月前
|
算法 测试技术 C#
【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组
【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组