No.1@leetcode

  这两天抽空在leetcode上看了几道题,完全没思路,有点困惑了,因为基础算法我都不知道,就这么一道道的找经验?还是先了解基础的算法?难 道要看神书《算法导论》?做了2道,都不太好,百度了思路后才会做,在算法方面明显没啥天赋。看书是不太现实,手头有本《Data Structure,Algorithms,and Applications in C++》正在看,代码非常简洁规范,感觉挺好,预计年底看完,算法导论目前没打算。只能一道道的找经验了,先练几十道题试一下。

    第一题,确实让我学到了东西,那就是Hash的牛逼。题目描述可以去www.leetcode.com上去看,大体就是给定一个数target在一个数组中找出2个数a1,a2,使得他们的和为target,且index(a1)<index(a2);显然,最简单也是最容易想到的就是暴力搜索,时间复杂度是O(n2),奇怪的是这道题并没有在时间复杂度方面做要求,所以我就试着暴力搜索提交,结果accept。这不是在机试,得分就搞定,出这道题肯定别有用心嘛,但是我想不到其他方法了,经百度,果然是犀利的Hash,以前复试的时候,有道题用Hash很方便,时间复杂度是O(n),现在忘了。所以,以后做题的时候,肯定会想Hash这个方法,下面就贴出应用Hash的代码:

public int[] twoSum(int[] numbers, int target) {
        java.util.HashMap<Integer,Integer> hash = new java.util.HashMap<Integer,Integer>();
        int length = numbers.length;
        int result[] = new int[2];
        for(int i=0;i<length;i++){
            if(hash.get(target-numbers[i])!=null){
                result[0] = hash.get(target-numbers[i])+1 ;
                result[1] = i+1 ;
            }else{
                hash.put(numbers[i],i);
            }
        }
        return result ;
    }
 真是简洁又巧妙,不禁折服了。
 
   好惭愧的说,好长时间不动C++了,本来以前就会点基本语法,现在忘的差不多了,所以查了C++ Primer才了解了一下类模板vector和map容器的基本使用 方法,下面就贴出C++代码:
 1 vector<int> twoSum(vector<int> &numbers, const int target) {
 2         int len = numbers.size();  
 3         vector<int> ret(2,0);  
 4         map<int, int> mapping;              
5 for(int i = 0; i < len; i++){ 6 if(mapping.count(target-numbers[i])){ 7 ret[0] = mapping[target-numbers[i]]+1; 8 ret[1] = i + 1; 9 break; 10 } else { 11 mapping[numbers[i]] = i; 12 } 13 } 15 return ret; 16 }

  此题主要在思路,比较简单,所以并未加注释,而且,leetcode上已经写好了函数头,后台judge应该也引入了需要的库文件,因为我没去掉#include<map>  using namespace std ;也是accept,至此,此题告一段落。

 

 

posted @ 2013-11-29 22:40  Thunderstorms  阅读(257)  评论(0编辑  收藏  举报