LeetCode Two Sum 题库记录--代码小白开始码代码的人生,第一天!

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;
    }
}

本问题存在的问题:当不止一对数满足该要求时,但只返回了一对。


        

 

   

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值