C++实现LeetCode(167.两数之和之二 - 输入数组有序)

 更新时间:2021年08月02日 14:21:16   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(167.两数之和之二 - 输入数组有序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 167.Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

这又是一道Two Sum的衍生题,作为LeetCode开山之题,我们务必要把Two Sum及其所有的衍生题都拿下,这道题其实应该更容易一些,因为给定的数组是有序的,而且题目中限定了一定会有解,我最开始想到的方法是二分法来搜索,因为一定有解,而且数组是有序的,那么第一个数字肯定要小于目标值target,那么我们每次用二分法来搜索target - numbers[i]即可,代码如下:

解法一:

// O(nlgn)
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        for (int i = 0; i < numbers.size(); ++i) {
            int t = target - numbers[i], left = i + 1, right = numbers.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (numbers[mid] == t) return {i + 1, mid + 1};
                else if (numbers[mid] < t) left = mid + 1;
                else right = mid;
            }
        }
        return {};
    }
};

但是上面那种方法并不efficient,时间复杂度是O(nlgn),我们再来看一种O(n)的解法,我们只需要两个指针,一个指向开头,一个指向末尾,然后向中间遍历,如果指向的两个数相加正好等于target的话,直接返回两个指针的位置即可,若小于target,左指针右移一位,若大于target,右指针左移一位,以此类推直至两个指针相遇停止,参见代码如下:

解法二:

// O(n)
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int l = 0, r = numbers.size() - 1;
        while (l < r) {
            int sum = numbers[l] + numbers[r];
            if (sum == target) return {l + 1, r + 1};
            else if (sum < target) ++l;
            else --r;
        }
        return {};
    }
};

类似题目:

Two Sum III - Data structure design

Two Sum

参考资料:

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/

到此这篇关于C++实现LeetCode(167.两数之和之二 - 输入数组有序)的文章就介绍到这了,更多相关C++实现两数之和之二 - 输入数组有序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 内部排序之堆排序的实现详解

    内部排序之堆排序的实现详解

    本篇文章是对堆排序的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中读取时间日期的基本方法

    C语言中读取时间日期的基本方法

    这篇文章主要介绍了C语言中读取时间日期的基本方法,分别是time()函数和gmtime()函数的使用,注意返回值的区别,需要的朋友可以参考下
    2015-08-08
  • C++实现LeetCode(174.地牢游戏)

    C++实现LeetCode(174.地牢游戏)

    这篇文章主要介绍了C++实现LeetCode(174.地牢游戏),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ std::copy与memcpy区别小结

    C++ std::copy与memcpy区别小结

    本文主要介绍了C++ std::copy与memcpy区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • c++如何控制输出浮点数小数点后若干位

    c++如何控制输出浮点数小数点后若干位

    这篇文章主要介绍了c++如何控制输出浮点数小数点后若干位问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 详解C/C++如何获取路径下所有文件及其子目录的文件名

    详解C/C++如何获取路径下所有文件及其子目录的文件名

    这篇文章主要为大家详细介绍了在C/C++中如何获取路径下所有文件及其子目录的文件名,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++实例代码详解友元函数

    C++实例代码详解友元函数

    采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数
    2022-06-06
  • Qt QFile文件操作的具体使用

    Qt QFile文件操作的具体使用

    很多应用程序都需要具备操作文件的能力,Qt 框架提供了 QFile 类专门用来操作文件。本文就来详细的介绍一下,感兴趣的可以了解一下
    2021-11-11
  • 在编程语言中怎样定义队列及其使用(C++)

    在编程语言中怎样定义队列及其使用(C++)

    这篇文章主要介绍了在编程语言中怎样定义队列,本文主要根据c++来介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 简单比较C语言中的execl()函数与execlp()函数

    简单比较C语言中的execl()函数与execlp()函数

    这篇文章主要介绍了C语言中的execl()函数与execlp()函数的简单比较,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08

最新评论