【LeetCode】(数组)1.两数之和

题目

在这里插入图片描述

题解

1.暴力破解(双重for)

双重for循环直接暴力遍历出所有。

	/**
	 * @思路 暴力破解,双重循环查找,找到则退出
	 * @时间复杂度 O(n^2)
	 * @复杂度 O(1)
	 */
	public static int[] twoSum(int[] nums, int target) {
		for (int i = 0; i < nums.length; i++) {
			for (int j = i + 1; j < nums.length; j++) {
				if (target == nums[i] + nums[j]) {
					return new int[]{i, j};
				}
			}
		}
		throw new IllegalArgumentException("No two sum solution.");
	}

2.哈希表

用空间换时间。

先将所有数存放到哈希表,再遍历一次所有数,遍历的同时查找哈希表中是否有另一个值。

	/**
	 * @思路 空间换时间,用哈希表。
	 * 		第一个for循环将所有数都放入map,
	 * 		第二个for循环用来查找另一个数,如果找到另一个数,并且那个数不为当前数nums[i],则返回。
	 * @时间复杂度 O(n)
	 * @空间复杂度 O(n)
	 */
	public static int[] twoSum2(int[] nums, int target) {
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < nums.length; i++) {
			// 键为数字,值为索引
			map.put(nums[i], i);
		}
		for (int i = 0; i < nums.length; i++) {
			// 另一个数
			int another = target - nums[i];
			// 包含另一个数,且这个数不是当前i
			if (map.containsKey(another) && map.get(another) != i) {
				return new int[]{i, map.get(another)};
			}
		}
		throw new IllegalArgumentException("No two sum solution.");
	}

3.哈希表(优化)

空间换时间

遍历所有数,如果在当前数之前,需要查找的另一个值已经存在,则直接返回。否则放入map继续查找。

	/**
	 * @思路 同上,优化一下
	 * 		单个for循环,先查找map中是否包含另一个数,如果包含另一个数则返回。
	 * 		不包含则将当前数放入。
	 */
	public static int[] twoSum3(int[] nums, int target) {
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < nums.length; i++) {
			// 另一个数
			int another = target - nums[i];
			// 包含另一个数
			if (map.containsKey(another)) {
				return new int[]{map.get(another), i};
			}
			// 放入当前数
			map.put(nums[i], i);
		}
		throw new IllegalArgumentException("No two sum solution.");
	}

参考

LeetCode官方题解

发布了115 篇原创文章 · 获赞 136 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44034328/article/details/104118321