LeetCode 双指针:Two Sum 2

12 篇文章 1 订阅

一、两数之和(有序数组)

在这里插入图片描述

二、题目理解

只要判定 target = A[i] + A[j] 即可!

1、暴力枚举法

基本思想:
-当i=0, j=1, 2, 3, … n-1;
-当i=1, j= 2, 3, … n-1;
-当i=2, j= 3, … n-1;

也就是说,双重循环,当满足判定条件时,返回 (下标数+1) 即可!

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int n = numbers.size();
        vector<int> newa(2, 0);  // 定义一个大小为2,元素都为0的一维数组
        for(int i=0; i < n-1; i++ ){
            for(int j = i + 1; j<n; j++){
                if(numbers[i] + numbers[j] == target)
                {
                    // 找到target位置,存储在新定义数组中
                    newa[0] = i+1;
                    newa[1] = j+1;
                }
            }
        }
        return newa;
    }
};

但是很明显,暴力枚举法超出时间限制。

2、二分查找法

考虑到题目中还有一个条件,就是针对的数组是 升序数组, 那么就满足一个条件
在这里插入图片描述
此时即可考虑二分法。

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int n = numbers.size();
        
        
        for(int i=0; i<n; i++){
            int l =i+1, r = n-1;
            while(l<=r){
                int m = (r-l)/2 + l;   // 重点是调控改变这个中间的数
                int sum = numbers[m] + numbers[i];
                if(sum == target){
                    return {i+1, m+1};
                }
                else if(sum > target)
                     r = m-1;
                else
                     l = m+1;
            }
        }
        
        return {-1, -1};
    }
};

3、双指针法

遍历初始位置与最后位置,利用二分法的思想,依次将 sum==target进行对比,得到结果再看!

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

三、官方答案

1、官方答案

2、双指针法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shae Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值