力扣 - 剑指 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的两个数字的更多相关文章
- 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针
剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...
- 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列
题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...
- 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...
- 力扣 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目 剑指 Offer 53 - I. 在排序数组中查找数字 I 思路1 一般来说,首先想到的是使用一个变量,从头开始遍历整个数组,记录target数组出现的次数,但是这样的时间复杂度是O(n),还是 ...
- 剑指 Offer 57. 和为s的两个数字
本题 题目链接 题目描述 我的题解 双指针 思路分析 因为该数组是递增数组,所以我们可以用双指针法. 声明指针left 和 right分别指向数组的头(数组下标为0)和尾(数组下标为length-1) ...
- [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列
[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...
- 【剑指Offer】和为S的两个数字 解题报告(Python)
[剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 刷题-力扣-剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...
随机推荐
- mybatis和hibernate区别
一.本质区别和应用场景
- 数据治理中Oracle SQL和存储过程的数据血缘分析
数据治理中Oracle SQL和存储过程的数据血缘分析 数据治理中的一个重要基础工作是分析组织中数据的血缘关系.有了完整的数据血缘关系,我们可以用它进行数据溯源.表和字段变更的影响分析.数据合规性 ...
- 远程桌面连接(mstsc)全攻略
打算从今天开始,写一写我经常用的,有长时间使用经验的东西,与大家分享,就从mstsc开始吧! mstsc应该是在Windows中,除了calc.cmd.notepad.mspaint,我使用率最高的系 ...
- 线程调用BeginInvoke
线程异步调用 Thread objThread = new Thread(new ThreadStart(delegate { Dispatch ...
- 使用Java MVC模式设计一个学生管理系统
最近在做web实验,要求是用jsp+servlet+mysql实现一个学生管理系统,完成对数据库的增删改查. 效果图: 代码: package dao; import java.util.List ...
- 使用IntelliJ工具打包kotlin为bat文件运行报错 Exception in thread "main" java.lang.NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError 这个很有可能是因为idea里的java版本与电脑上的java环境 ...
- Elasticsearch6.8.6版本 在head插件中 对数据的增删改操作
一.访问ES方法:http://IP:PORT/ 一.创建索引:head插件创建索引的实例:在"索引"-"新建索引"中创建索引名称,默认了分片与副本情况: 直接 ...
- phpmyadmin 设置密码
例如 xampp 安装路径为 /opt/lampp/, copy 一份默认的配置 cp /opt/lampp/phpmyadmin/libraries/config.default.php /opt/ ...
- 不关闭selinux下配置php+httpd访问KingbaseES
在不关闭selinux的情况下使httpd+php+KingbaseES正常使用1.正常设置php.apache 除了正常流程外还需要在/etc/sysconfig/httpd最后追加LD_LIBRA ...
- Loj#3026-「ROIR 2018 Day1」管道监控【Trie,费用流】
正题 题目链接:https://loj.ac/p/3026 题目大意 给出\(n\)个点的一棵外向树,然后\(m\)个字符串和费用表示你每次可以花费这个费用覆盖路径字符串和给出字符串相等的路径,求覆盖 ...