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.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;
}
}
本问题存在的问题:当不止一对数满足该要求时,但只返回了一对。