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

举报
布小禅 发表于 2021/08/10 10:12:40 2021/08/10
【摘要】 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]
    
    
    

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

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

结语

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

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。