<jupyter_start><jupyter_text>0167. Two Sum II ProblemGiven a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two numbers be `numbers[index1]` and `numbers[index2]` where `1 <= index1 < index2 <= numbers.length`.Return the indices of the two numbers, `index1` and `index2`, added by one as an integer array `[index1, index2]` of length 2.The tests are generated such that there is exactly one solution. You may not use the same element twice.Your solution must use only constant extra space. Examples Example 1:``` textInput: numbers = [2,7,11,15], target = 9Output: [1,2]Explanation: The sum of 2 and 7 is 9. Therefore, index1 = 1, index2 = 2. We return [1, 2].```Example 2:```textInput: numbers = [2,3,4], target = 6Output: [1,3]Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].```Example 3:```textInput: numbers = [-1,0], target = -1Output: [1,2]Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].``` Constraints:```text2 <= numbers.length <= 3 * 104-1000 <= numbers[i] <= 1000numbers is sorted in non-decreasing order.-1000 <= target <= 1000The tests are generated such that there is exactly one solution.```  AnalysisFor the two-sum problem in `0001`, hashing table results in a time complexiy to $O(n)$, and a space complexity to $O(n)$ due to the introduction of extra hashing table.This problem requires the space complexity to be $O(1)$. We can solve it using two-pointer algorithms.  Solution<jupyter_code># Solution: naive solution O(m+n) - two-pointers
def solution(nums, target):
    l ,r = 0, len(nums)-1
    while l < r:
        a = nums[l]
        b = nums[r]
        if a + b == target:
            return [l+1, r+1]
        elif a + b > target:
            r += -1
        else:
            l += 1

# test
nums = [2, 7, 11, 15]
target = 9
print(solution(nums, target))

nums = [2, 3, 4]
target = 6
print(solution(nums, target))

nums = [-1, 0]
target = -1
print(solution(nums, target))<jupyter_output>[1, 2]
[1, 3]
[1, 2]
{'fraction_non_alphanumeric': 0.12851782363977485, 'fraction_numerical': 0.054878048780487805, 'mean_word_length': 3.5969827586206895, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '633287', 'license': 'MIT', 'n_tokens_mistral': 767, 'n_tokens_neox': 680, 'n_words': 295, 'path': 'letsleetcode/leetcode/0167-two-sum-ii.ipynb', 'repo_name': 'YangyangFu/letsleetcode-python', 'size': '2132'}