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

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


1.png

文章目录


前言

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

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

📢:❤布小禅❤

📢 作者专栏:

❤Python❤

❤Java❤

这是我刷第 11/100 道力扣简单题


一、题目描述

给定一个已按照 升序排列 的整数数组 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

仅存在一个有效答案


二、题目分析

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

所以我们就有了一种解法

  1. 暴力解法
    直接嵌套循环
    但是我试了一下,发现提交失败,因为太费时间了
  2. 双指针法
    一个指针放开头,一个放尾部
    然后判断下标所对应的元素相加和target相比较
    如果小于就让头部指针往后移动
    如果大于就让尾部指针往前移动
    如果等于就返回[头部指针+1, 尾部指针+1]
    因为numbers数组/列表是以1为第一个下标的
  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]
  1. 双指针法
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]
  1. 二分法
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]

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

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


结语

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

1.png

目录
相关文章
|
22天前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
1月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记
|
1月前
|
搜索推荐
《LeetCode》——LeetCode刷题日记3
《LeetCode》——LeetCode刷题日记3
|
1月前
|
容器
《LeetCode》——LeetCode刷题日记1
《LeetCode》——LeetCode刷题日记1
|
1月前
|
存储
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
140 38
|
1月前
《LeetCode》——LeetCode刷题日记2
《LeetCode》——LeetCode刷题日记2
|
1月前
|
机器学习/深度学习 算法 索引
leetcode热题100.两数之和
leetcode热题100.两数之和
13 1
|
1月前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
1月前
|
存储
力扣刷题-最大子数组和
力扣刷题-最大子数组和
10 1
|
1月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)