【算法专题】双指针—和为s的两个数

一、题目解析

【算法专题】双指针—和为s的两个数_第1张图片

只需在这个数组中找出两个数相加等于target即可 

二、算法原理

1、暴力解法(时间复杂度:O(n^2))

 两个for循环嵌套遍历这个数组即可,不过会超时

class Solution {
public:
    vector twoSum(vector& price, int target) {
        int n = price.size();
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                if(price[i] + price[j] == target)
                {
                    return {price[i], price[j]};
                }
            }
        }
        return {-1,-1};
    }
};

说明一下c++中是支持这样返回的,并且最后没找到的话也要返回一个数值,因为力扣编译器的缘故,必须得要有值返回否则力扣编译器会报错。

2、双指针(时间复杂度:O(n))

 因为题目中的升序条件,所以这题可以用双指针来做。

情况一:sum = left + right > target ——> right--

 【算法专题】双指针—和为s的两个数_第2张图片

 情况二:sum = left + right < target ——> left++

 【算法专题】双指针—和为s的两个数_第3张图片

情况三:sum = left + right == target 

返回结果就行了  

三、代码编写

class Solution {
public:
    vector twoSum(vector& price, int target) {
        int left = 0, right = price.size() - 1;
        while(left < right)
        {
            int sum = price[left] + price[right]; 
            if(sum > target) right--;
            else if(sum < target) left++;
            else return {price[left], price[right]};
        }
        return {-1,-1};
    }
};

你可能感兴趣的:(算法,算法,leetcode,c++)