167. Two Sum II - Input array is sorted(双指针的使用)

problems:
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.

Note:

Your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution and you may not use the same element twice.

Example:

Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.

tips;
简单题目,给定已升序排列的序列,找两个元素求和为指定的值,返回其位置.学习点在返回值的类型.
solutions:
1.暴力法寻找解:两个for循环

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int n = numbers.size();
        if(!n) return {0,0};
        int idx1,idx2;
        if(numbers[0] > target) return {0,0};
        for(int i = 0;i < n;i++)
        {
            if(numbers[i] <= target ) 
            {
                idx1 = i+1;
                for(int j = idx1;j < n;j++)
                {
                    if(numbers[i] + numbers[j] == target)
                    {
                        idx2 = j + 1;
                        return {idx1,idx2};
                    }
                    else
                    if(numbers[j] > target) 
                    {
                        idx2 = 0;
                        idx1 = 0;
                        break;
                    }
                }
            }
            
        }
        return {0,0};//为什么只能放在for循环的外面???
    }
};

2.二分法求解:

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

3.使用两个指针;

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
       int n = numbers.size();
       int i =0;
       int j = n-1;
        
       while(i < j)
       {
           int t = numbers[i] + numbers[j];
           if(t == target) return {i+1,j+1};
           else
               if(t > target) j--;
           else
               i++;
       }
        return {0,0};
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值