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水题(一)的更多相关文章

  1. leetcode水题题解

    344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...

  2. 解决一道leetcode算法题的曲折过程及引发的思考

    写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...

  3. 这样leetcode简单题都更完了

    这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...

  4. LeetCode算法题-Can Place Flowers(Java实现)

    这是悦乐书的第272次更新,第287篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第140题(顺位题号是605).假设你有一个花坛,其中一些地块是种植的,有些则不是. 然 ...

  5. LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  6. LeetCode算法题-Poor Pigs(Java实现)

    这是悦乐书的第235次更新,第248篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第102题(顺位题号是455).有1000个水桶,其中只有一个水桶含有毒药,其余的都没毒 ...

  7. 乘风破浪:LeetCode真题_011_Container With Most Water

    乘风破浪:LeetCode真题_011_Container With Most Water 一.前言 下面我们继续进行编程练习,可以说对于实际问题的活学活用是非常重要的.比如我们这次的题目,就需要从中 ...

  8. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  9. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配   17.8% 困难 45 跳跃游戏 II   25.5% 困难 55 跳跃游戏   30.6% 中等 122 买卖股票的最佳时机 II C ...

随机推荐

  1. 【前端】ACE Editor 简易使用示例

    身为一个早已退役的Oier,当然忘不了当年一个个OJ页面上的代码显示和代码编辑器. 其中,洛谷使用的ACE Editor就是之一,非常的简洁美观.以及实际上在前端页面上搭建一个ACE Editor也是 ...

  2. ImportError: No module named cv2 解决方法

    ImportError: No module named cv2 解决方法   import cv2时会出现这个问题 解决方法:将openCV安装目录里的python文件夹内的cv2.pyd复制到Py ...

  3. LKNotification控件-通知控件

    通知控件 项目介绍: 一个通知控件,长得很像iOS系统的通知栏弹出时候的样式.可以多个通知覆盖.引入项目之后,只需调用一行代码即可 [Java] 查看源文件 复制代码 ? 1 LKNotificati ...

  4. PHP语言开发微信公众平台(订阅号)之curl命令

    在开发过程中,经常会遇到要求用curl命令调用接口的情况 那么,什么是curl,简单来说curl是一个利用url语法规定来传输文件和哦数据的工具,支持很多协议,如 http.ftp.telent 等, ...

  5. RabbitMQ-从基础到实战(4)— 消息的交换(下)

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) 1.简介 ...

  6. javaList容器中容易忽略的知识点

    在集合类框架中,List是使用比较多的一种 List |---Arraylist 内部维护的是一个数组,查找快增删慢 |---LinkedList 底层是链表,增删快查询慢. |---Vctor线程安 ...

  7. Servlet+jsp的分页案例

    查询的分页,在web中经常用到.一般,分页要维护的信息很多,我们把这些相关的信息,分装到一个类中,PageBean.具体如下: package cn.itcast.utils; import java ...

  8. java操作txt文本(一):遇到指定字符换行

    想法由来:有时查看网页源代码的css文件内容,竟是恼人的压缩后代码(不换行),如下图所示-- 它的可读性很差,所以写了下面这个简单的程序,实现自动换行. 适用条件:遇到指定字符换行(本例中遇到'}'换 ...

  9. jsp中的动作标签

    和html标签一样,使用尖括号'<>'包裹起来. 用于在jsp页面中处理业务逻辑,避免在jsp中过多的使用java脚本. <jsp:forward>用于请求转发,它与Reque ...

  10. 模块化规范Common.js,AMD,CMD

    随着网站规模的不断扩大,嵌入网页中的javascript代码越来越大,开发过程中存在大量问题,如:协同开发,代码复用,大量文件引入,命名冲突,文件依赖. 模块化编程称为迫切的需求. 所谓的模块,就是实 ...