给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
题目来源:LeetCode
方法一 :最简单的暴力两层循环
看了题目,最先想到的是,只要进行两层循环,对所有的数字进行一次相加,当和为target时,将两个值的index返回即可。
public int[] TwoSum(int[] nums, int target)
{int[] indexs = new int[2];for (int i = 0; i < nums.Length; i++){for (int j = i + 1; j < nums.Length; j++){if (nums[i] + nums[j] == target){index[0] = i ;index[1] = j ;return indexs ;}}}return indexs ;
}
执行结果,执行用时 480ms,内存消耗 29.6MB .
复杂度分析
时间复杂度: O(n^2)
空间复杂度: O(1)
这个方式解基本上算是用时最久的了
方法二 :哈希表(c# Dictionary )
对于方法一的时间复杂度 O(n^2) 不太满意,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中每个元素与其索引相互对应的最好方法是 哈希表。
哈希表 可以 用空间来换取时间,将查找时间从O(n)降低为O(1). 哈希表正是为此目的而构建的,它支持以 近似 恒定的时间进行快速查找。 这里用 “近似”来描述,是因为一旦出现冲突,查找用时可能会退化到O(n)。 但只要仔细的挑选哈希函数,在哈希表中进行查找的用时应当被摊销为O(1).
C#中, 官方建议哈希表使用 Dictionary 类 来实现。
public int[] TwoSum(int[] nums, int target)
{int complement;int[] indexs = new int[2];Dictionary<int, int> result = new Dictionary<int, int>();for (int i = 0; i < nums.Length; i++){complement = target - nums[i];if (result.ContainsKey(complement) && result[complement]!=i){indexs[0] = result[complement];indexs[1] = i;return indexs;}if (!result.ContainsKey(nums[i])){result.Add(nums[i], i);}} return indexs;
}
执行结果 ,执行用时 280ms,内存消耗 30.1MB .
复杂度分析
时间复杂度: O(n)
空间复杂度: O(n)
耗时大大减少
有兴趣的可以看 leetcode 上本题其他语言的各种解法和评论 附上链接
https://leetcode-cn.com/problems/two-sum/solution/