zoukankan      html  css  js  c++  java
  • Leetcode(一)两数之和

    1.两数之和


    题目要求:

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。
    你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
    示例:

    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    思路一:暴力抓取
    依次取一个数m,寻找剩下的数组中是否存在target-m,存在则找到。

    public static int[] twosum(int[] nums, int target){
            int array[]=new int[2];
            for(int i=0;i<nums.length;i++){
               for(int j=i+1;j<nums.length;j++){
                   if((target-nums[i])==nums[j]) {
                       array[0] = i;
                       array[1] = j;
                       return array;
                   }
               }
            }
            return null;
    

    这样的话时间复杂度为O(n^2),空间复杂度为O(1)。

    思路二:Hash映射
    思路一的方法时间复杂度肯定不合格,我们就应该要考虑如何降低啦。很容易想到那就是我们在寻找target-m的时候不去遍历数组,而是采用将数组放到散列表/哈希数组中去,直接查看是否存在即可。

    int array[]=new int[2];
            HashMap<Integer,Integer> m=new HashMap<Integer, Integer>();
            for (int i = 0; i < nums.length; ++i) {
                m.put(nums[i], i);
            }
            for(int i=0;i<m.size();i++){
                //这里注意不仅要判断HashMap中是否存在target-nums[i],还要防止出现同一元素出现两次,比如                      [3,2,4],target=6,返回结果就会变成array[0,0]。
                if(m.containsKey(target-nums[i])&&(i!=m.get(target-nums[i]))){
                    array[0]=i;
                    array[1]=m.get(target-nums[i]);
                    return array;
                }
            }
            return null;
    

    这种情况下,以空间换时间,我们的时间复杂度就变为O(n),空间复杂度也为O(n)。

  • 相关阅读:
    IO流
    简单JSON
    开发流程
    命名规范
    策略模式
    Git的使用
    Markdown的使用
    代理模式
    装饰者模式
    POJ 2976 3111(二分-最大化平均值)
  • 原文地址:https://www.cnblogs.com/fankailei/p/10100753.html
Copyright © 2011-2022 走看看