• 【LeetCode】双指针求解和为s的两个数字


    在这里插入图片描述

    Problem: 剑指 Offer 57. 和为s的两个数字

    题目解析

    首先来讲解一下本题的思路

    • 我们看到本题的意思很简单,就是去这个nums这个数组中进行寻找,如果找到了两个数相加之和为target的话,那构成一个结果集并返回

    1.jpg

    算法思路分析

    接下去我们来分析一下本题的思路

    1. 暴力解法
    • 首先第一种,我们都会想到的就是【暴力求解】,那就是使用两层for循环,去一一地做匹配工作,不过这种解法我们可想而知,一定会超时,所以这里不做过多的叙述
    for(int i = 0;i < nums.size(); ++i)
        for(int j = i + 1;j < nums.size(); ++j)
    
    • 1
    • 2

    2.jpg

    1. 利用单调性,使用双指针算法进行求解
    • 我们的话主要还是利用双指针的这种解法去解决本题,一个left指针指向最左端,一个right指针指向最右端,通过前后遍历去寻找哪两个数可以构成结果为【target】

    3.jpg

    • 这里会出现三种情况,首先是第一种,若是我们碰到了nums[left] + nums[right] < target,那此时我们就可以去做一个取巧的工作
    • 读者可以再去仔细地阅读一下本题的题目意思,便可以知道这个数组序列是呈现递增排列的,那么既然【2】和最大的【21】都比target要来得小了,和【21】前面的这个几个数就要来得更小了,此时我们无需再去多次一举进行比较。此时只需执行left++

    4.jpg

    • 接下去我们再来考虑一下这个nums[left] + nums[right] > target的情况,那我们知道这种情况也是不符合的,但是呢再去进行判断的时候我们还可以做进一步的简化
    • 读者可以先行思考一下,此时我们应该排除掉哪个数字呢?那很明显就是这个【21】,为什么呢?想一下这个【21】和最小的【11】都会超过target了,那么其余的【15】和【19】岂不是更加会超过了?
    • 所以呢这个【21】我们应该将其舍去才对,对应到代码即为right--

    5.jpg

    • 那最后这一种的话就是找到了的情况,此时我们只需返回这两个数据的结果集的即可

    6.jpg

    复杂度

    • 时间复杂度:

    考虑到最坏的情况,即为我们在遍历寻找的时候两个左右指针相遇了,即为没找到,那也就是把这个序列遍历了一遍,其时间复杂度 O ( n ) O(n) O(n)

    • 空间复杂度:

    没有开辟任何额外的空间,所以空间复杂度为 O ( 1 ) O(1) O(1)

    Code

    以下是代码展示

    • 这里的话讲一下和这个{nums[left], nums[right]},可能有的小伙伴不是很清楚,此属于 C++初始化列表 的相关知识
    • 一般我们在LeetCode中返回两个数的集合时无需再去创建新的vector集合,而是会通过隐式类型转换构成一个vector集合进行返回
    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            int left = 0, right = nums.size() - 1;
            int sum = 0;
            while(left < right)
            {
                sum = 0;
                sum = nums[left] + nums[right];
                if(sum < target){
                    left++;
                }else if(sum > target){
                    right--;
                }else{
                    return {nums[left], nums[right]};
                }
            }
            return {-1, -1};
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

  • 相关阅读:
    Vue中使用keep-alive导致mounted和beforeDestroy钩子函数失效
    App Deploy as Code! SAE & Terraform 实现 IaC 式部署应用
    大数据之Spark(一)
    CUDA中的线程层次
    头歌平台 第2关:整数四则运算表达式的输出格式控制
    C++项目:仿mudou库实现高性能高并发服务器
    springCloud在pom中快速修改运行环境,让配置不再繁琐
    C++ :设计模式实现
    Git与SSH
    Java HashMap常见面试题
  • 原文地址:https://blog.csdn.net/Fire_Cloud_1/article/details/132699366