LeetCode-两数之和
LeetCode题目如下:
给定一个整数数组nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
暴力求解
利用双层循环,第一层循环遍历nums数组中的所有元素,第二层循环遍历从第一层元素之后的元素开始遍历到数组末尾(其实就是将所有可能的情况全部列出来),因为思路非常简单,这里直接给出代码:
public class Solution {
public int[] TwoSum(int[] nums, int target) {
for(int i = 0;i < nums.Length;i++)
{
for(int j = i + 1;j < nums.Length;j++)
{
if (nums[i] + nums[j] == target)
return new int[] { i, j};
}
}
return new int[0];
}
}
哈希表求解
使用暴力求解的方法,其时间复杂度为O(n^2),使用哈希表解题的思路就是避免使用第二层循环,从而使得时间复杂度为O(n)。
思路:
我们假设有这样的数据存在:
nums = [ 7, 2, 3]
target = 10
将nums中的元素值作为key,nums的下标值作为value
遍历数组,使用target - nums[i]可以得出对应的那个数(我们默认 当前数 + 数组中的其他数字 可以得出目标数)
如果哈希表不包含该key,则将其添加进哈希表,key为nums[i],value为i。
//这里i是下标,其实就是将nums[i]中的数据取出来作为哈希表中的key,将i作为对应的value
如果哈希表包含该key,则将其返回,其返回值就是哈希表中nums[i]对应的value以及当前遍历到的数组下标
模拟执行过程(学会在纸上演示执行过程对自己的编程思想提升很有帮助且刚好理解):
当i = 0时
target - nums[0] 相当于 10 - 7 = 3 哈希表中不包含key为3的键值对 故存储数据:哈希表.添加(nums[i], i)
当i = 1时
target - nums[1] 相当于 10 - 2 = 8 哈希表中不包含key为8的键值对 故存储数据:哈希表.添加(nums[i], i)
当i = 2时
target - nums[2] 相当于 10 - 3 = 7 哈希表中包含key为7的键值对,故返回数据:{nums[i],i}
实现如下:
public class Solution
{
public int[] TwoSum(int[] nums, int target)
{
Hashtable hashtable = new Hashtable();
int[] result = new int[2];
for(int i = 0;i < nums.Length;i++)
{
if (hashtable.ContainsKey(target - nums[i]))
return new int[] { (int)(hashtable[target - nums[i]]), i};
hashtable.Add(nums[i],i);
}
return new int[0];
}
}