记录一——两数之和

两数之和

题目描述:给出一个整数数组,和一个目标值,返回数组中两数之和等于目标值的下标。
例:nums=[2,7,11,15],target=9
因为nums[0]+nums[1]=2+7=9, return [0,1]
[注]:此题的重点是进行查询,该题方法有很多种,不考虑语言特性的话,时间复杂度:O(n2),空间复杂度:O(1)

1. 暴力破解:

该方的所有法也是首先会想到的方法,两两结合,循环遍历数组中的所有可能组合,并判断是否满足条件。
public int[] twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) {
                return new int[] { i, j };
            }
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

【注】:1)java中数组的定义的3种方式

		//第一种
		int[] nums1 = new int[2];
        nums1[0] = 0;
        nums1[1] = 1;

        //第二种 
        int[] nums2 = {0,1,2,......};

        //第三种 
        int[] nums3 = new String[]{0,1,2,3,......};

2)异常的抛出

  • 不做任何操作,当程序出现逻辑错误时系统自动抛出异常,不做任何处理
  • 利用throw抛出,一般是出现在代码内部,也就是将错误甩锅给函数,抛出特定类型的异常,不做任何处理
  • throws抛出,通常用于函数声明时,表示可能会抛出一个异常。也就是当该函数执行出现异常时,将该异常甩锅给上层调用它的函数处理
public vodid function() throws Exception{......}
//在编程时,要养成好的习惯,用try{...}catch{...},在捕捉异常后要在catch中进行处理,哪怕是简单的栈输出e.printStackTrace();
//在捕捉IO流的异常时,要在try{…}catch{…}后加finally{…}把输入输出流关闭;

2.利用哈希表

public int[] twoSum(int[] nums, int target) {
   Map<Integer, Integer> 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 complement = target - nums[i];
       if (map.containsKey(complement) && map.get(complement) != i) {
           return new int[] { i, map.get(complement) };//HashMap的几个方法
       }
   }
   throw new IllegalArgumentException("No two sum solution");
}
//时间复杂度:O(n),空间复杂度:O(n)

【注】:哈希表存储的是键值对,刚好满足本题的条件,Map是collection框架的重要内容,在面试中有非常大的可能性会问到。这里记录一下Map集合的几种类型区别:

  • HashMap和HashTable:两者继承的父类不同,但都实现了Map接口,主要区别在于线程的问题(不是很懂)
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 
  • HashMap和HashSet:
    <1>HashMap实现的是Map接口,对键值对进行映射,它允许出现空值(返回null),且不允许出现重复的,使用put()方法放入元素,用唯一的键来获取对象。本题就是利用HashMap 的该特性来解题
    <2>HashSet实现的是Set接口,它不允许集合中有重复的,仅仅存储对象。使用add()方法放入元素,equals()方法判断对象是否相等。

有空看看collection框架,了解HashTable和HashMap的详细区别

猜你喜欢

转载自blog.csdn.net/w1375834506/article/details/87893171