leetcode水题(一)
Two Sum 1
public int[] twoSum(int[] numbers,int target){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<numbers.length;i++){
int num = numbers[i];
if(map.containsKey(target-num)){
return new int[]{map.get(num)+1,i+1};
}
map.put(num, i);
}
throw new IllegalArgumentException("No two sum solution");
}
首先,暴力解法也就是遍历数组中的每个数字,在数组中寻找target-当前数字,显然时间复杂度比较高,这是一个O(n²)的算法,而在上述代码中我们使用了一个map以O(n)的空间换时间,由于map的put和contains都是O(1)复杂度的操作,算法的时间复杂度为O(n)。
Two Sum 2
题目2和题目1类似,只是在这里input是一个有序的数组,当然我们可以采用题目1的解法,只是貌似没有利用上有序这个条件。
那么谈到有序数组,最常用的算法包括二分查找和双指针法。
public int[] twoSum2(int[] numbers,int target){
int l = 0, r = numbers.length - 1;
while(l<r){
int num = numbers[l] + numbers[r];
if(num<target){
l++;
} else if(num>target){
r--;
} else {
return new int[]{l+1,r+1};
}
}
throw new IllegalArgumentException("no solution");
}
首先是双指针法,很直观的想法,我们用两个指针向数组中间移动,如果当前指向的两数之和num小于给定数字target,我们就将左指针向右移动一位,如果两数之和大于给定数字,就将右指针向左移动一位,直至与给定数字相等。
public int[] twoSum3(int[] numbers,int target){
for(int i=0;i<numbers.length;i++){
int targetNum = target - numbers[i];
int j = binarySearch(numbers,targetNum,i+1);
if(j!=-1){
return new int[]{i+1,j+1};
}
}
return numbers;
}
public int binarySearch(int[] numbers,int key,int begin){
int l = 0,r = numbers.length-1;
while(l<r){
int midum = (l+r)>>>1;
if(numbers[midum]<key){
l = midum+1;
} else if(numbers[midum]>key){
r = midum;
} else {
return midum;
}
}
return -1;
}
二分法这里稍显复杂,但与前面的思路类似,我们遍历给定数组中的每个数字,计算出目标数字与给定数字的差,并使用二分法在剩余数组中查找该值,二分法的时间复杂度为
O(log n),故算法整体复杂度为O(nlogn)。
Two Sum3
该题目是让我们设计一个数据结构,支持add 和find操作,add操作很简单,即将数字加入当前数据结构中,find操作为在数据结构中找到两数字,其和为给定数字。
显然,这样的题目最简单的做法就是将add进来的所有数字一一求和,并存储在一个哈希表里面,这样在find操作执行时就能以O(1)的时间复杂度直接返回结果,这样的
算法并不是不好,相反,在一个‘读多写少’的场景下,这样的算法很有用。
另外一个想法是在每一个add操作执行时找到当前插入元素‘应该插入的位置’,这里我们利用了插入排序的思想,即保证了我们数据结构中的数字始终是有序状态的,这样,在
find操作执行时,由于数组有序,可以使用双指针法找到结果值。
最后一个方法使用一个HashMap存储,在这里不得不感叹Map的通用性,主要因为在很多算法中,我们都需要‘以空间换时间’,而Map操作的复杂度又很低,故深受众多码农
朋友青睐。
待续。。。。
参考资料:
1.leetcode
2. clean code handbook
leetcode水题(一)的更多相关文章
- leetcode水题题解
344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- 这样leetcode简单题都更完了
这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...
- LeetCode算法题-Can Place Flowers(Java实现)
这是悦乐书的第272次更新,第287篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第140题(顺位题号是605).假设你有一个花坛,其中一些地块是种植的,有些则不是. 然 ...
- LeetCode算法题-Island Perimeter(Java实现)
这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...
- LeetCode算法题-Poor Pigs(Java实现)
这是悦乐书的第235次更新,第248篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第102题(顺位题号是455).有1000个水桶,其中只有一个水桶含有毒药,其余的都没毒 ...
- 乘风破浪:LeetCode真题_011_Container With Most Water
乘风破浪:LeetCode真题_011_Container With Most Water 一.前言 下面我们继续进行编程练习,可以说对于实际问题的活学活用是非常重要的.比如我们这次的题目,就需要从中 ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
随机推荐
- nodejs学习第一天之模块
1.运行js文件 2.node 与 js 的区别 相同:数据类型,语法结构,对象 等基本一致 不同:在js中的顶层对象window 在node中没有在node中 顶层对象为global对象 其不对外 ...
- 3713: [PA2014]Iloczyn
3713: [PA2014]Iloczyn Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 327 Solved: 181[Submit][Status ...
- Tyvj P1813 [JSOI2008]海战训练
P1813 [JSOI2008]海战训练 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 为了准备高层峰会,元首命令武装部队必须处于高度戒备.警察将监视每一条 ...
- 求助,如何干掉这个不要脸的“流氓”
问题 chrome 第一次打开时,被一个加"7654 导航"的网站捆绑. 查看设置中启动页中,被设置如下: 解决 域名查看,阿里竟然为这样的网站搞隐私保护 尝试 安 ...
- Java的一些基础知识
1.do-while循环不论循环条件判断结果,至少会执行一次. 2.Javac用于Java源代码文件编译成字节码的编译器. 3.import关键字导入包. 4.Java是Sun公司与1995年退出的高 ...
- 老司机实战Windows Server Docker:3 单节点Windows Docker服务器简单运维(上)
经过上两篇实战Windows Server Docker系列文章,大家对安装Windows Docker服务以及如何打包现有IIS应用为docker镜像已经有了基本认识.接下来我们来简单讲讲一些最基本 ...
- 多线程爬坑之路-J.U.C.atomic包下的AtomicInteger,AtomicLong等类的源码解析
Atomic原子类:为基本类型的封装类Boolean,Integer,Long,对象引用等提供原子操作. 一.Atomic包下的所有类如下表: 类摘要 AtomicBoolean 可以用原子方式更新的 ...
- iOS开发之@Selector参数的传递
比如: NSMutableDictionary *dic = [[NUMutableDictionary alloc]init]; [dic setValue:@”haha” forKey:@”tes ...
- iOSiOS开发之退出功能(易错)
如果,我们有两个控制器,第一个控制器是MainController,它是与Main.storyboard相关联的.第二个控制器是myController.假设myController中有一个退出按钮, ...
- 实验楼-4-Linux文件权限
$ ls -l /*查看文件权限*/ 每一行格式意思: <文件类型和权限 链接数 所有者 所在用户组 文件大小 上次修改时间 文件名> 文件类型和权限如下图: 解释: 软连接:类似于win ...