LeetCode题库整理【Java】
1.两数之和
题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
返回 [0, 1]
方法一:这道题目比较容易想到的是通过暴力搜索求解,但暴力搜索的时间复杂度为 O(n^2)。Java代码如下:
public class SumOfTwoNums {public static void main(String[] args) {int[] nums=new int[] {-3,4,3,90};int target=0;SumOfTwoNums solution=new SumOfTwoNums();solution.twoSum(nums, target);}public int[] twoSum(int[] nums, int target) { int index[]=new int[]{0,0};for(int i=0;i<nums.length-1;i++) {for(int j=i+1;j<nums.length;j++) {if( (target-nums[i]==nums[j]) ) {index[0]=i;index[1]=j;System.out.println(index[0]+" "+index[1]);break;}} }return index;}
}
在LeetCode中提交的结果如下:
方法二:使用哈希的思想,利用Python中list的查询方式,我们可以将复杂度降低到 O(n)。有两个值得注意的地方:
(1). 同样的元素不能重复使用(也就是不能自己加自己) (2). 给定的数组中可能有相同的元素(比如 [3, 3, 4, 4, 5]),也可能会有负数(比如[-3,0,3,8,10])
HashMap是Java中集合的一部分。它提供了Java的Map接口的基本实现。它将数据存储在(Key,Value)对中。
void clear():用于从Map中删除所有映射。
boolean containsKey(Object key):用于如果对于指定的键,映射value存在于映射中则返回True。
boolean containsValue(Object value):用于在一个或多个键映射到指定值时返回true。
boolean isEmpty():用于检查映射是否为空。如果地图为空,则返回true。
set entrySet():用于返回哈希映射的set视图。
Object get(Object key):用于检索或获取特定键映射的值。
Set keySet():用于返回键的设置视图。
int size():用于返回Map的大小。
Object put(Object key,Object value):用于将键值对的特定映射插入到映射中。
putAll(Map M):用于将所有元素从一个Map复制到另一个Map。
Object remove(Object key):用于删除Map中任何特定键的值。
class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();int res[]=new int[2];for(int i=0;i<nums.length;i++) {if( hm.containsKey(target-nums[i]) ) {//hm.put(nums[i], i);//此行前置就可能出现自己加自己的情况,比如nums={3,2,4},target=6,运行结果为[0,0]; 实际应该为[1,2]res[0]=i;res[1]=hm.get(target-nums[i]);System.out.println(res[0]+" "+res[1]);break;}hm.put(nums[i], i);//此行不能前置}return res;}
}
对比可以看见运行时间缩短了很多。