LeetCode Two Sum 题库记录--代码小白开始码代码的人生,第一天!
2015-07-10 10:48
429 查看
1. Two Sum
服自己了,都不好意思说自己是搞java android开发的,连基本的java定义数组都不会! int[] array=new int[5];
返回值也不会,什么return/break/continue;
踉踉跄跄用java实现了,可是完全不够优化,这就不是个好方法,暴力搜索,时间复杂度O(n*n); 如下
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
for(int i = 0; i<nums.length; i++ )
{
for(int j=i+1; j<nums.length; j++)
{
if(nums[i] + nums[j] == target)
{
// System.out.print("Index1 = "+ (i+1) + " , " + "Index2 =" + (j+1));
Index[0] = i+1; //有可能满足这样要求的不止这一对。
Index[1] = j+1;
break;
}
}
}
return Index;
}
} 时间复杂度O(n*n); Runtime: 500 ms
继续优化,能不能先对数组排序,并记录排序候在原数组的位置,这样来进行后面的操作后更省事省时。但是有个问题是,返回的要求是Index1 >Index2,所以考虑这种方法是否更有呢?
【 插曲,基础知识补充。
不过可以自己实现下排序并记录位置的java代码。 //ArrayTest.java
System.out.println(Arrays.toString(ary)); //一次性正体打印数组
System.out.println(Arrays.asList(ary)); //可以将 数组转为List 但是,这个数组类型必须是 引用类型的,如果是8种基本数据类型就不可以
其中asList的学习见如下链接:http://blog.csdn.net/anders_zhuo/article/details/8960996
】
参考网上的方法:http://blog.sina.com.cn/s/blog_7bee572b0101ux4q.html 学习使用java的Map HashMap类
时间复杂复:Runtime: 352 ms java代码还是比人家常规的java代码复杂好多。。
import java.util.HashMap;
import java.util.Hashtable;
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
Map map = new HashMap();
for(int i=0 ; i<nums.length; i++){
map.put(nums[i],i);
}
for(int i=0 ; i<nums.length; i++){
int gas = target - nums[i];
if(map.get(gas)!=null && (int)(map.get(gas))!=i){
Index[0] = i + 1;
Index[1] = (int)(map.get(gas)) + 1;
break;
}
}
return Index;
}
}
人家网站上显示的时间复杂复在100~200之间是怎么做到的?
一哭,Runtime: 332 ms
算法思想:分别将所有比较过得数与target的差值一个个放入map中,当比较到map里面含有nums[i]时表示已经找到了这两个数。
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i =0; i<nums.length; i++){
if(map.containsKey(nums[i])){
Index[0]=map.get(nums[i])+1;
Index[1]= i+1;
break;
}else{
map.put(target-nums[i],i);
}
}
return Index;
}
}
本问题存在的问题:当不止一对数满足该要求时,但只返回了一对。
服自己了,都不好意思说自己是搞java android开发的,连基本的java定义数组都不会! int[] array=new int[5];
返回值也不会,什么return/break/continue;
踉踉跄跄用java实现了,可是完全不够优化,这就不是个好方法,暴力搜索,时间复杂度O(n*n); 如下
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
for(int i = 0; i<nums.length; i++ )
{
for(int j=i+1; j<nums.length; j++)
{
if(nums[i] + nums[j] == target)
{
// System.out.print("Index1 = "+ (i+1) + " , " + "Index2 =" + (j+1));
Index[0] = i+1; //有可能满足这样要求的不止这一对。
Index[1] = j+1;
break;
}
}
}
return Index;
}
} 时间复杂度O(n*n); Runtime: 500 ms
继续优化,能不能先对数组排序,并记录排序候在原数组的位置,这样来进行后面的操作后更省事省时。但是有个问题是,返回的要求是Index1 >Index2,所以考虑这种方法是否更有呢?
【 插曲,基础知识补充。
不过可以自己实现下排序并记录位置的java代码。 //ArrayTest.java
System.out.println(Arrays.toString(ary)); //一次性正体打印数组
System.out.println(Arrays.asList(ary)); //可以将 数组转为List 但是,这个数组类型必须是 引用类型的,如果是8种基本数据类型就不可以
其中asList的学习见如下链接:http://blog.csdn.net/anders_zhuo/article/details/8960996
】
参考网上的方法:http://blog.sina.com.cn/s/blog_7bee572b0101ux4q.html 学习使用java的Map HashMap类
时间复杂复:Runtime: 352 ms java代码还是比人家常规的java代码复杂好多。。
import java.util.Hashtable;
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
Map map = new HashMap();
for(int i=0 ; i<nums.length; i++){
map.put(nums[i],i);
}
for(int i=0 ; i<nums.length; i++){
int gas = target - nums[i];
if(map.get(gas)!=null && (int)(map.get(gas))!=i){
Index[0] = i + 1;
Index[1] = (int)(map.get(gas)) + 1;
break;
}
}
return Index;
}
}
人家网站上显示的时间复杂复在100~200之间是怎么做到的?
一哭,Runtime: 332 ms
算法思想:分别将所有比较过得数与target的差值一个个放入map中,当比较到map里面含有nums[i]时表示已经找到了这两个数。
public class Solution {
public int[] twoSum(int[] nums, int target) {
int[] Index = new int[2]; //java中定义数组都不会int[] array=new int[5];
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i =0; i<nums.length; i++){
if(map.containsKey(nums[i])){
Index[0]=map.get(nums[i])+1;
Index[1]= i+1;
break;
}else{
map.put(target-nums[i],i);
}
}
return Index;
}
}
本问题存在的问题:当不止一对数满足该要求时,但只返回了一对。
相关文章推荐
- java 调用 sql server存储过程
- lavaral5单元测试,post方式提交,方式无法进入
- c++primer要点-字符串、向量和数组
- 【Java】一个数组实现三个栈 (未完待续)
- 如何用PHP生成二维码实例
- 去掉eclipse中自动生成的注释//TODO Auto-generated method stub
- 【j2ee spring】38、巴巴运动网的产品文件的上传
- C#生成唯一不重复订单号
- C语言实现二叉树的递归遍历和非递归遍历
- C#注册表操作,根据键取值
- Java正则表达式示例
- 简述堆栈的区别
- 创建自定义的Java注解类的方法
- spring jms
- Python retry的一个AOP实现 (Python中级)
- C语言中结构体内存分配机制
- [转] 值得推荐的C/C++框架和库
- php URL判断
- 安卓蓝牙通信
- java 读取excel文件