题目

剑指 Offer 57. 和为s的两个数字

思路1(哈希表)

  • 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我们使用HashSet来解决
  • 我们知道hash的查找速度是\(O(1)\),因此遍历到每个元素的时候判断一下,target-nums[i]是否存在HashSet中,如果存在,则找到;如果不存在,那么就将当前元素加入到HashSet中,继续遍历下一个元素,时间复杂度降低到了\(O()N\),但是也使用了\(O(N)\)的空间复杂度,而且当前数组是排序数组的条件也没有使用上

代码

class Solution {
public int[] twoSum(int[] nums, int target) {
HashSet<Integer> set = new HashSet<>(); // 只需遍历一次数组
for (int i = 0; i < nums.length; i++) {
// 如果target-nums[i]在HashSet中,说明找到了
if (set.contains(target - nums[i])) {
return new int[]{nums[i], target-nums[i]};
}
// 否则要做的只是将当前元素添加到HashSet中
set.add(nums[i]);
} // 没有找到的话返回一个空数组
return new int[0];
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\),哈希表所使用的空间

思路2(双指针)

  • 题目已经说了,数组是按照升序排序的数组,因此我们可以利用这个条件,使用双指针解题
  • 若数组为nums = [2,7,11,15], target = 9,则步骤如下:
    • 初始化左右指针left、right分别为:0、3(nums.length-1)
    • left、right位置的元素的值相加得17,大于target 9,说明我们两个数之和的值需要向下调整,又因为数组是升序的数组,因此right指针向左移动一位,此时left为0,right为2
      • 再次相加,结果为13,还是大于target 9,因此right指针再次向左移动一位,此时left为0,right为1
      • 然后再相加,此时结果为9,等于target,所以我们找到了这两个数返回即可

代码

class Solution {
public int[] twoSum(int[] nums, int target) {
int left = 0;
int right = nums.length-1; // 要保证left指针在right指针左边
while (left < right) {
// 找到了
if (nums[left] + nums[right] == target) {
return new int[]{nums[left], nums[right]};
} else if (nums[left] + nums[right] > target) {
// 总和太大了,需要向小调整,故right向左移动一位
right--;
} else {
// 总和太小了,需要向大调整,故left向右移动一位
left++;
}
}
// 没找到
return new int[0];
}
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\),由于使用了双指针,所以没有使用额外的空间

力扣 - 剑指 Offer 57. 和为s的两个数字的更多相关文章

  1. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  2. 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列

    题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...

  3. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  4. 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I

    题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...

  5. 剑指 Offer 57. 和为s的两个数字

    本题 题目链接 题目描述 我的题解 双指针 思路分析 因为该数组是递增数组,所以我们可以用双指针法. 声明指针left 和 right分别指向数组的头(数组下标为0)和尾(数组下标为length-1) ...

  6. [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列

    [剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...

  7. 【剑指Offer】和为S的两个数字 解题报告(Python)

    [剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  8. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  9. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

随机推荐

  1. 如果还是看不懂container_of()函数,那算我输

    在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义 ...

  2. IIS托管Asp.net Core及Abp VNext

    默认方式安装IIS后,从官方网站下载IIS模块 https://dotnet.microsoft.com/download/dotnet-core/3.1 2个都需要安装 安装后,新建网站指向发布的磁 ...

  3. ms sql 带自增列 带外键约束 数据导入导出

    1,生成建表脚本 选中要导的表,点右键-编写表脚本为-create到  ,生成建表脚本 2,建表(在新库),但不建外键关系 不要选中生成外键的那部分代码,只选择建表的代码 3,导数据,用SQL STU ...

  4. 计算字符串的长度.len,RuneCountInString

    内置函数len(),可以返回字符串/数组/切片/map/channel的长度. unicode/utf8包 函数:RuneCountInString(输入一个字符串),返回int类型的字符串长度.由于 ...

  5. Python新手的奇技淫巧,掌握在手的充实感

    以下是我长久以来收集的一些Python实用技巧和工具,希望能对刚学习Python的新手有所帮助.  1.交换变量 x = 6 y = 5 x, y = y, x print x >>> ...

  6. composer出现问题: Could not open input file: composer.phar

    可以执行下面命令 php -r "readfile('https://getcomposer.org/installer');" | php This will install c ...

  7. python实现rtsp取流并截图

    import cv2 def get_img_from_camera_net(folder_path): cap = cv2.VideoCapture("rtsp://admin:admin ...

  8. 在反序列化数据的时候报错raise JSONDecodeError("Expecting value", s, err.value) from None json.decode

    今天在爬取某网站数据内容适合,通过正则匹配拿到了需要的内容字符串,但是在反序列化的时候竟然报错,大概意思知道他不是json的期望值,那么我就会像是不是数据内有一些内容是由于编码的问题导致的呢?因为之前 ...

  9. 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04

    百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...

  10. PolarDB PostgreSQL logindex 设计

    背景介绍 PolarDB采用了共享存储一写多读架构,读写节点RW和多个只读节点RO共享同一份存储,读写节点可以读写共享存储中的数据:只读节点仅能各自通过回放日志,从共享存储中读取数据,而不能写入,只读 ...