本文纯干货,看不懂来打我!
自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode)
简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。
我认为你要是没有思路的话,不妨暴力求解(没有暴力解决不了的),然后再看能不能优化一下,对吧。
思路1.暴力穷举法(2层for循环,把所有可能的情况列举出来,时间复杂度O(n^2)):
代码如下:
- class Solution {
- public int[] twoSum(int[] nums, int target) {
- int[] result=new int[2];
- for (int i = 0; i < nums.length; i++) {
- for (int j = i + 1; j < nums.length; j++) {
- if (nums[i] + nums[j] == target) {
- result[0]=i;
- result[1]=j;
- return result;
- }
- }
- }
- return result;
- }
- }
由于暴力穷举使得一些数重复被扫描,那么我们能不能减少这种不必要的重复扫描呢?
思路2:借助哈希表(时间复杂度降到O(N))
假设target=20,nums数组的数为:4,6,13,8,7,9
i 先指向第一个数字4
具体步骤:
步骤1:20-4=16,看看哈希表里面有没有16,显然是没有的,那么把4放到哈希表,然后 i++
步骤2:20-6=14,看看哈希表里面有没有14,显然是没有的,那么把6放到哈希表,然后 i++
步骤3:20-13=7,看看哈希表里面有没有7,显然是没有的,那么把13放到哈希表,然后 i++
步骤4:20-8=12,看看哈希表里面有没有12,显然是没有的,那么把8放到哈希表,然后 i++
步骤5:20-7=13,看看哈希表里面有没有13,显然是有的。结束
如果还不明白,请看VCR
注意:哈希表里面的key是数字,value是数字对应的下标
- class Solution {
- public int[] twoSum(int[] nums, int target) {
- Map
storeNums=new HashMap<>(nums.length,1); - int[] result=new int[2];
- for(int i=0; i
- int another=target-nums[i];
- Integer anotherIndex=storeNums.get(another);
- if(anotherIndex!=null){
- result[0]=anotherIndex;
- result[1]=i;
- break;
- }
- else storeNums.put(nums[i], i);
- }
- return result;
- }
- }