第一个leetcode,大概意思:在一个数组里,任意找两个数字,让它们的和等于一个给定目标值。要求:1、输出这两个数在数组的下标 2、保证第一个数的下标要小于第二个数的下标
做这个题,还是有一点点欣慰的地方就是:读完题,就有思路,而且能顺利编出来。(虽然因为那个小小的 return b 修改了好几次)
public class Solution { public int[] twoSum(int[] nums, int target) { int[] b = 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){ b[0]=i+1; b[1]=j+1; } } } return b; } }
不多说,直接上 Submission Details。。。。看到这运行时间,我也是醉了(也第一次看到了Java与众语言的差距。。。)
不过在讨论版里学习了O(n)的方法:思路是先往map里面存一个numbers[0]的元素,判断target-numbers[0] 的结果存在于map中:如果不在,往map存numbers[1],判断target-numbers[1] 的结果是否存在于map中(此时target-numbers[1]的查找值只有numbers[0])。。。。依次类推,如果存在,则说明刚刚好遇到了结果,直接输出index1和(i+1),因为(i+1)总是要大于index1的~
另外还要纠正原来的思维定式:map<key,value>中,总以为key是要为value服务的(value比key重要),其实不然,key和value处在同等地位!以后还需要勤思考啊~!
public int[] twoSum(int[] numbers, int target) { Map<Integer, Integer> map = new HashMap<Integer,Integer>(); for(int i = 0; i < numbers.length; i++) { Integer index1 = map.get(target-numbers[i]); if (index1 != null) { //第一次进循环,可以从这里先看 return new int[]{index1,i+1}; } map.put(numbers[i], i+1); } return null; }
时间: 2024-11-04 18:04:03