深知程序员和码农的区别在于数据结构与算法,所以,我要开始刷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是常数级的查找效率
步骤
- 将所有的数组存放至HashMap中
- 遍历数组,将target-nums[i],就可以得到另一个目标数
- 查询HashMap中是否含有此目标数
- 查询成功,则返回结果
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循环中
步骤
- 通过target-nums[i]获取目标数
- 查询HashMap中是否含有此目标数
- 有则返回两个目标数,无则将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%的用户