LeetCode学习之路(1.两数之和)

mac2025-03-17  13

文章目录

LeetCode 1.两数之和题目:思路一:思路二 作为一个面临找工作压力的菜鸡儿,不得不拿起曾经最不喜欢的java,练练题。也不敢说把所有题刷完,只能尽量坚持了。

仅用于做题经历分享,巩固学习。

如果有什么缺点,希望指正,

LeetCode 1.两数之和

题目:

给定一个整数数组 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,看了别人题解的思路,比我的简洁多了。 但因为还没学到这个数据类型,所以学会了以后再把这个思路补完吧。

最新回复(0)