zoukankan      html  css  js  c++  java
  • LeetCode题解 #1 Two Sum

    在LeetCode做的第一到题

    题目大意:给出n个数,在其中找出和为一个特定数的两个数。

    Input: numbers={2, 7, 11, 15}, target=9
    Output: index1=1, index2=2

    返回这两个数在原数组内的下标。

    我的思路:

    1、遍历数组 int temp = target-num[i]

    2、查找数组内有没有符合的temp存在。

    3、因为这个题目是肯定会有符合条件的两个数的,所以temp肯定存在。

    但这样会遇到这些问题:

    1、查找最快的是使用二分查找,但是二分查找需要数组有序!

    2、给数组排序的话,最快是使用快速排序!

    3、但是后来发现,快速排序之后,元素的下标基本改变了,但是题目要求返回原数组中的下标!

    4、如果有相同的两个数符合条件的话,返回靠后的那个数,即二分查找要返回最后一个找到的数!

    综合以上,就需要使用大量的代码进行修补。

    我的解决办法是:

    设计一个类

    class fuzhu{


    public int data;//存放数据
    public int ori;//存放原来数组的下标



    }

    遍历原数组,建立这个fuzhu数组

    这样就不会在快排的时候丢失原来的下标。

    至于二分查找,因为都是有序的,所以相同的数据都会排在一起,所以在找到一个数只有,只要一直往后遍历看看有没有相同的数就好。

    以上是刚开始做的思路,但这种做法真的太麻烦了,懒得贴代码了!

    正确做法:HashMap!

    1、遍历一次数组,建立一个Map。Map里面 key是元素的值,value是元素原来的下标。

    2.不需要排序,不需要二分查找,直接看Map里面有没有temp的key存在(除了自己),返回key的value。

    3、由于相同的key会覆盖掉原来的value值,所以Map里面的value值肯定是靠后的那一个!

    public static int[] twoSum(int[] nums, int target){

    Map<Integer,Integer> hash = new HashMap<Integer,Integer>();
    int [] ans = new int [2];

    for(int i=0;i<nums.length;i++){

    hash.put(nums[i], i);

    }

    //System.out.println(hash.get(100));

    for(int i=0;i<nums.length;i++){

    int temp = target - nums[i];
    //System.out.println(temp);

    if(hash.get(temp)!=null&&hash.get(temp)!=i){

    //System.out.println(hash.get(temp));

    if(i<=hash.get(temp)){

    ans[0]=i+1;
    ans[1]=hash.get(temp)+1;
    break;


    }
    else{

    ans[0]=hash.get(temp)+1;
    ans[1]=i+1;
    break;
    }

    }


    }

    return ans;


    }

    总结:这道题如果只是查找有没有这两个数存在的话,用我的第一次的方法是很好的。但是要留意题目说的,返回原来数组中的值,并且要最靠后,用Hash表的话

    由于相同的key会覆盖掉原来的value值,所以Map里面的value值肯定是靠后的那一个!所以HashMap真是最好的办法啦。

    跟数组有关的题目,很大部分用HashMap可以很快解决。

  • 相关阅读:
    mysql升级大致
    初始化配置文件的使用:/etc/my.cnf
    mysql用户管理
    MySql的逻辑结构(抽象结构)与物理结构
    5.7与5.6版本在部署方面的改变
    MySql服务器进程结构
    MySql服务器构成 --实列
    mysql客户端与服务器端模型
    RDBMS和NoSQL区别即主流sql
    MySql基本操作
  • 原文地址:https://www.cnblogs.com/wzben/p/5008505.html
Copyright © 2011-2022 走看看