LeetCode第167题—两数之和 II - 输入有序数组—Python实现

Posted StriveZs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第167题—两数之和 II - 输入有序数组—Python实现相关的知识,希望对你有一定的参考价值。


title: LeetCode No.167

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第167题

题目描述

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

 
示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
 

提示:

2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

代码

思路很简单,但是需要考虑的各种条件很多。

#
# @lc app=leetcode.cn id=167 lang=python
#
# [167] 两数之和 II - 输入有序数组
#

# @lc code=start
from math import fabs


class Solution(object):
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]

        题目分析:
            题目要求:
                你所设计的解决方案必须只使用常量级的额外空间
                因为假设只存在只对应唯一的答案,所以可以用数组来存储
                而且要保证indexs1 < indexs2
                仅存在一个有效答案
            思路一:
                通过双循环来实现, 可能时间复杂度上会高
                在18/21个测试用例挂了,超时了
            思路二:
                因为数组是非递增排列的,考虑从大往小找
                并设置indexs统计数值相同的下标,如果当前相同数值不满足的话,直接从统计下标再开始
                为了减小时间复杂度而设计
        """
        # 思路一:
        '''
        for i in range(len(numbers)):
            for j in range(i+1, len(numbers)):
                if numbers[i] + numbers[j] == target:
                    return [i+1,j+1]
        '''
        # 思路二: 双指针 第一个指针单遍循环 第二个指针用于找第二个下标
        indexs = len(numbers) - 1
        target1 = None
        while indexs >= 0:
            if target - numbers[indexs] != 0:
                if target - numbers[indexs] > 0:
                    sec = indexs + 1
                    target1 = target - numbers[indexs]
                    if target1 - numbers[0] < 0:
                        indexs -= 1
                        continue
                    for i in range(indexs):
                        if target1 - numbers[i] < 0:
                            indexs -= 1
                            break
                        if target1 - numbers[i] == 0:
                            return [i+1, sec]
                elif target - numbers[indexs] < 0:
                    sec = indexs + 1
                    if indexs == 51:
                        t = numbers[indexs]
                    target1 = target - numbers[indexs]
                    if target1 - numbers[0] < 0:
                        indexs -= 1
                        continue
                    for i in range(indexs):
                        if target1 - numbers[i] > 0:
                            indexs -= 1
                            break
                        if target1 - numbers[i] == 0:
                            return [i+1, sec]
                else:
                    indexs -= 1
            elif target == 0 and numbers[indexs] == 0:
                return [indexs,indexs+1]
            elif target != 0 and target - numbers[indexs] == 0:
                if 0 in numbers:
                    sec = numbers.index(0)
                    return [sec+1,indexs+1]
                else:
                    indexs -= 1
            else:
                indexs -= 1
        

            


            
                

# s = Solution()
# print(s.twoSum(numbers = [-1000,-1,0,1], target = 1))
# @lc code=end


以上是关于LeetCode第167题—两数之和 II - 输入有序数组—Python实现的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第167题—两数之和 II - 输入有序数组—Python实现

LeetCode做题笔记第167题:两数之和 II - 输入有序数组

LeetCode第5天 - 283. 移动零 | 167. 两数之和 II - 输入有序数组

LeetCode 167. 两数之和 II - 输入有序数组

LeetCode 313. 超级丑数(最小堆动态规划)/413. 等差数列划分/167. 两数之和 II - 输入有序数组

LeetCode 167. 两数之和 II - 输入有序数组 | Python