zoukankan      html  css  js  c++  java
  • LeetCode_1——两数之和(Two sum)

    深知程序员和码农的区别在于数据结构与算法,所以,我要开始刷Leetcode题目的道路,嘻嘻

    题目

    给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。
    您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
      给定nums = [2,7,11,15],target = 9,
      因为nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9,
      返回[ 0,1 ]。

    解法一

    思想

       暴力破解,两次循环遍历将数组中的数分别相加等于target,再返回索引

    class Solution {
        public int[] twoSum(int[] nums, int target) {
            int[] arrs=new int[2]; ;
            int sum=0;
            for (int i = 0; i <nums.length; i++) {
                for (int j = 0; j <nums.length&&i!=j ; j++) {
                    sum=nums[i]+nums[j];
                    if(target==sum){
                        arrs[0]=i;
                        arrs[1]=j;
                    }
    
                }
            }
    
            return arrs;
        }
    }

    结果

      执行用时 :95 ms, 在所有Java提交中击败了8.21% 的用户  
      内存消耗 :37.2 MB, 在所有Java提交中击败了90.74%的用户
      用时过长,典型的时间换空间的做法

    解法二

    思想

      暴力破解的算法复杂度是O(n2),尝试使用O(n),那么意味着只能遍历一次数字,那另一个数字?
      我们需要将另一个数字放至HashMap,来建立数字与坐标位置之间的映射,HashMap是常数级的查找效率

    步骤

    1. 将所有的数组存放至HashMap中
    2. 遍历数组,将target-nums[i],就可以得到另一个目标数
    3. 查询HashMap中是否含有此目标数
    4. 查询成功,则返回结果
    int[] arrs=new int[2]; ;
            int sum=0;
            HashMap<Integer,Integer> hashMap=new HashMap<>();
            for (int i = 0; i <nums.length; i++) {
                hashMap.put(nums[i],i);
            }
            for (int i = 0; i <nums.length; i++) {
                int num=target-nums[i];
                if(hashMap.containsKey(num)&&hashMap.get(num)!=i){
                    arrs[0]=i;
                    arrs[1]=hashMap.get(num);
                    break;
                }
            }
    return arrs;

    结果

      执行用时 :7 ms, 在所有Java提交中击败了88.43% 的用户
      内存消耗 :38.9 MB, 在所有Java提交中击败了51.18%的用户

    解法三

    思想

      将解法二的两个循环放在一个for循环中

    步骤

    1. 通过target-nums[i]获取目标数
    2. 查询HashMap中是否含有此目标数
    3. 有则返回两个目标数,无则将nums[i]存放至HashMap中
    int[] arrs=new int[2]; ;
            HashMap<Integer,Integer> hashMap=new HashMap<>();
            for (int i = 0; i <nums.length; i++) {
                int num=target-nums[i];
                if(hashMap.containsKey(target-nums[i])){
                    arrs[0]=i;
                    arrs[1]=hashMap.get(target-nums[i]);
                    break;
                }
                hashMap.put(nums[i],i);
            }
    return arrs;

    结果

      执行用时 :6 ms, 在所有Java提交中击败了94.30% 的用户
      内存消耗 :38.9 MB, 在所有Java提交中击败了51.36%的用户
  • 相关阅读:
    Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary
    在HyperlinkButton的URL地址里附加多个参数(以http get的方式)
    SilverLight CheckBox 控件 DataContext属性与DataContextChanged事件
    关于事件在意料之外触发的问题
    关于Telerik RadGridView 数据列拖动后异常的一种情况
    silverlight使用小计(先做记录后续整理)
    Redis_简介和安装
    Python并行系统工具_multiprocessing模块
    Python并行系统工具_程序退出和进程间通信
    Python并行系统工具_进程分支
  • 原文地址:https://www.cnblogs.com/echola/p/11003612.html
Copyright © 2011-2022 走看看