[LeetCode] 167. Two Sum II

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.

思路:

与1. Tow Sum类似,这题的输入是有序数组,限定了一定会有解,用双指针来做,定义左右两个指针,左指针指向第一个数,右指针指向最后一个数,然后用这两个数的和与Target比较,如果比Target小,左指针向右移一位,如果比Target大,右指针向左移一位。然后再进行比较,直到找到或者两个指针相遇为止。

注意:左右指针是从0到 len(numbers)-1, 输出结果是从1开始的index.

Time: O(n)  Space: O(1)

Java: wo,  0 ms, faster than 100.00% of Java online submissions

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] res = new int[2];
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            if ((numbers[i] + numbers[j]) > target) {
                j--;
            } else if ((numbers[i] + numbers[j]) < target) {
                i++;
            } else {
                res[0] = i + 1;
                res[1] = j + 1;
                break;
            }            
        }
        return res;        
    }
}  

Java: 1 ms, faster than 68.07% of Java online submissions

public class Solution {  
    public int[] twoSum(int[] numbers, int target) {  
        if(numbers==null || numbers.length < 1) return null;  
        int i=0, j=numbers.length-1;  
          
        while(i<j) {  
            int x = numbers[i] + numbers[j];  
            if(x<target) {  
                ++i;  
            } else if(x>target) {  
                --j;  
            } else {  
                return new int[]{i+1, j+1};  
            }  
        }  
        return null;  
    }  
}    

Python:

class Solution:
    def twoSum(self, nums, target):
        start, end = 0, len(nums) - 1
        
        while start != end:
            sum = nums[start] + nums[end]
            if sum > target:
                end -= 1
            elif sum < target:
                start += 1
            else:
                return [start + 1, end + 1]  

C++:

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 {};
    }
};

  

相似题目:

[LeetCode] 1. Two Sum 两数和

[LeetCode] 170. Two Sum III - Data structure design 两数之和之三 - 数据结构设计

[LeetCode] 653. Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

原文地址:https://www.cnblogs.com/lightwindy/p/8481862.html