和 LeetCode Battle (1、两数之和)

博客讨论了一种经典的算法问题——找到数组中和为目标值的两个数。首先介绍了使用双层循环的暴力枚举方法,然后优化了代码,避免不必要的循环。最后提出使用HashMap实现更高效的解决方案,大大减少了时间复杂度。

题目:源自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写法!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值