题目:源自LeetCode
给定一个整数数组 nums 和一个整数目标值 target
请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
第一次想法:暴力枚举双循环
public class twoSum {
public static int[] twoSum(int[] nums, int target) {
int[] sum = new int[2];
for(int i = 0; i<nums.length;i++) {
for(int y =i+1;y<nums.length;y++) {
if(nums[i]+nums[y]==target) {
sum[0] = i;
sum[1] = y;
break;
}
}
if(sum[0]+sum[1]==target) {
break;
}
}
return sum;
}
public static void main(String[] args) {
int[] a = {3,2,4};
int[] b =twoSum(a,6);
for(int i = 0;i<b.length;i++) {
System.out.println(b[i]);
}
}
}
看了一下大神的解法:我终究还是太菜了
看了大神的暴力枚举 后精修自己的代码:
public static int[] twoSum(int[] nums, int target) {
int[] sum = new int[2];
//如果传来的数组中有且只有两个数 则直接返回该数组
if(nums.length==2) {
return nums;
}
for(int i = 0; i<nums.length;i++) {
for(int y =i+1;y<nums.length;y++) {
if(nums[i]+nums[y]==target) {
sum[0] = i;
sum[1] = y;
return sum;
}
}
}
return sum;
}
public static void main(String[] args) {
int[] a = {3,2,4};
int[] b =twoSum(a,6);
for(int i = 0;i<b.length;i++) {
System.out.println(b[i]);
}
}
精修处
第四行:如果传来的数组中有且只有两个数 则直接返回该数组 就不用浪费系统性能
第12行:如果符合条件的答案的话 直接return退出循环 哎 我居然没这样子想 当时脑子的思路是先退出第一次循环再 在外层循环判断是否已经符合条件 再退出 当时想着如何才能一次性退出双层循环…居然想不到,无语了…
还有一种写法:用HashMap
public static int[] twoSumMap(int[] nums, int target) {
if(nums.length==2){
return nums;
}
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
//如果存在符合条件的直接return
if(map.containsKey(target-nums[i])) {
return new int[] {map.get(target-nums[i]),i};
}
//不存在就加入
map.put(nums[i], i);
}
return new int[0];
}
太🐂了这个HashMap写法!!!
博客讨论了一种经典的算法问题——找到数组中和为目标值的两个数。首先介绍了使用双层循环的暴力枚举方法,然后优化了代码,避免不必要的循环。最后提出使用HashMap实现更高效的解决方案,大大减少了时间复杂度。
448

被折叠的 条评论
为什么被折叠?



