zoukankan      html  css  js  c++  java
  • [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 两数之和之四 - 输入是二叉搜索树

  • 相关阅读:
    【BZOJ 2565】 最长双回文串
    【BZOJ 2160】 拉拉队排练
    【POI 2010】 Antisymmetry
    【HDU 3068】 最长回文
    【POJ 3974】 Palindrome
    【POJ 2503】 Babelfish
    【POJ 3349】 Snowflake Snow Snowflakes
    【BZOJ 2457】 双端队列
    根文件系统的构建与分析(一)之流程分析
    Linux MTD系统剖析
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8481862.html
Copyright © 2011-2022 走看看