歌曲《平凡的一天》下面有条热评是这样说的:“小时候想过金碧辉煌灿烂的一生,长大后,平凡简单地过一生却那么难。云也轻,风也淡,没有牵绊、平凡的一天,我愿意用一切去交换。”
Leetcode原题
思路
本题中,操作数组就一个nums,实现的目的是寻找数组中能相加等于目标值的两个数的下标。
方法一 枚举法
双层循环遍历数组中的元素,找到2个能相加等于目标值的数就返回下标。
public class Solution { public int[] twoSum(int[] nums, int target){ int temp[] =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){ temp[0]=i; temp[1]=j; } } } return temp; } }
这种方法很容易想到,也很容易理解,但是该方法时间复杂度为O(N的2次方)。 我们需要减少一些时间复杂度,于是便有了第2个方法。
方法二 利用hashMap
方法一中对于每一个nums[i]都要再花费时间遍历剩下的元素来寻找target - nums[i],这就导致了最终O(n^2) 的时间复杂度,这就促使我们思考:我们用目标值tagrger减去每个数组元素nums[i]得出的值的时候,要是直接能判断该值在数组中存不存在,若是存在直接返回下标不就好了嘛。我们于是把目光投向了哈希表这一数据结构。
步骤:
- 建立一个初始长度为n-1的哈希表;
- 遍历数组中的元素
- 对任意一个元素,若target - nums[i]在哈希表中,则直接返回。
- 若不存在,若target - nums[i]t不在哈希表中,则将这个元素放入哈希表;
- 遍历完成后,若没有符合条件的两数,则返回空数组
/* 方法2 使用哈希表*/ public int[] twoSum(int[] nums, int target){ Map<Integer,Integer> map = new HashMap<Integer,Integer>(nums.length-1); for (int i=0;i<nums.length;i++){ int n= target-nums[i]; // if(map.containsKey(n)){ return new int[]{i, map.get(n)}; } map.put(nums[i],i);//遍历集合中的数存放到hashmap集合中 } return new int[]{}; }
提交测试
oh,yeh 还是辣么滴丝滑 雀氏润~~~~
因为目前个人算法能力有限,有更好的方法的小伙伴可以在评论区留言分享,大家一起共同进步。
有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取2022最新java面试资料以及简历模型120套哦~