LeetCode刷题167-简单-两数之和

Posted 布小禅

tags:

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

前言

算法作为极其重要的一点,是大学生毕业找工作的核心竞争力,所以为了不落后与人,开始刷力扣算法题!

第一遍,不求最优解,但求能过!!!

1. 题目描述

给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

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

示例 1:

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

输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]

提示:

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

2. 题目分析

首先这是之前做过的一道题(力扣第一题)的加强版(算是)

所以我们就有了一种解法

  1. 暴力解法

    直接嵌套循环

    但是我试了一下,发现提交失败,因为太费时间了

  2. 双指针法

    一个指针放开头,一个放尾部

    然后判断下标所对应的元素相加和target相比较

    如果小于就让头部指针往后移动

    如果大于就让尾部指针往前移动
    如果等于就返回[头部指针+1, 尾部指针+1]

    因为numbers数组/列表是以1为第一个下标的

  3. 二分查找法

    二分法也是两个指针

    不同的是让一个指针对应的元素值和中间值对应的元素之和与目标值比较

    如果相等就返回数组/列表

    如果大于就让尾部指针移到中间值

    如果小于就让头部指针移到中间值

3. 代码

  1. 暴力破解法(力扣提交不上,但是能用)

    class Solution:
        def twoSum(self, numbers: List[int], target: int) -> List[int]:
            for i in range(len(numbers)):
                for j in range(len(numbers)):
                    if i==j:
                        continue
                    elif numbers[i] + numbers [j] == target:
                        return [i+1, j+1]
    
    
  2. 双指针法

    class Solution:
        def twoSum(self, numbers: List[int], target: int) -> List[int]:
            low, high = 0, len(numbers) - 1
            while low < high:
                total = numbers[low] + numbers[high]
                if total == target:
                    return [low + 1, high + 1]
                elif total < target:
                    low += 1
                else:
                    high -= 1
    
            return [-1, -1]
    
    
  3. 二分法

    class Solution:
        def twoSum(self, numbers: List[int], target: int) -> List[int]:
            n = len(numbers)
            for i in range(n):
                low, high = i + 1, n - 1
                while low <= high:
                    mid = (low + high) // 2
                    if numbers[mid] + numbers[i] == target:
                        return [i + 1, mid + 1]
                    elif numbers[mid] + numbers[i] > target:
                        high = mid - 1
                    else:
                        low = mid + 1
            
            return [-1, -1]
    
    
    

二分法比双指针法占用资源多一点

之所以使用着两个方法,是因为我目前只会这两个

结语

坚持最重要,每日一题必不可少!

以上是关于LeetCode刷题167-简单-两数之和的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—167. 两数之和 II - 输入有序数组(双指针)—day20

Leetcode刷题100天—167. 两数之和 II - 输入有序数组(双指针)—day20

LeetCode刷题系列之-多数之和类型

LeetCode刷题系列之-多数之和类型

LeetCode刷题系列之-多数之和类型

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