仅用于做题经历分享,巩固学习。
如果有什么缺点,希望指正,
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
作为第一题,还是比较简单的,因为一眼就能想到暴力算法。就是标签一个从左,一个从右,遍历查找。
因为数组没有默认排序,所以先复制了一个数组进行排序。
ArrayList<Integer> two = new ArrayList<>(); int[] arrays = nums.clone(); ArrayList<Integer> result = new ArrayList<>(); Arrays.sort(arrays); int max = arrays[arrays.length-1]+1;一个双层嵌套循环,外层从右往左,内层从左往右。找出两个数。
for (int right = arrays.length - 1; right >= 0; right--) { for (int left = 0; left < right; left++) { if (arrays[left] > target - arrays[right]) { break; } else if (arrays[left] == target - arrays[right]) { result.add(arrays[left]); result.add(arrays[right]); break; } else { continue; } } if (result.size() != 0) break; }可以在 [left] > target - [right]的时候跳出内层循环,稍微优化过程
刚开始,本想先在排序好的数组中找到第一个大于target值的数,不计算后面更大的数,进而简化过程。但提交后的测试数组中有负数,所以这么做无效。
再用这两个数从原数组中找出位置。
for (int i1 = 0; i1 < nums.length; i1++) { if (nums[i1] == result.get(0) || nums[i1] == result.get(1)) { two.add(i1); if(nums[i1] == result.get(0)) result.set(0 , max); else result.set(1 , max); } } int[] real = {two.get(0) , two.get(1)}; return real;设置max是因为测试数据会有重复的值,所以在result匹配了一个后,重置为一个数组中不可能出现的数。
本以为,这个冗长,多遍历,多数组的暴力代码过不了,但提交后,过了就过了吧。。。
利用HashMap,看了别人题解的思路,比我的简洁多了。 但因为还没学到这个数据类型,所以学会了以后再把这个思路补完吧。